diff --git a/megamek/i18n/megamek/client/messages.properties b/megamek/i18n/megamek/client/messages.properties
index d11b943ffd..2753c8c183 100644
--- a/megamek/i18n/megamek/client/messages.properties
+++ b/megamek/i18n/megamek/client/messages.properties
@@ -2174,15 +2174,15 @@ MekSelectorDialog.Search.Armor25=25% of maximum
MekSelectorDialog.Search.Armor50=50% of maximum
MekSelectorDialog.Search.Armor75=75% of maximum
MekSelectorDialog.Search.Armor90=90% of maximum
-MekSelectorDialog.Search.WeaponClass=Has Weapon Type:
-MekSelectorDialog.Search.Weapons=Has weapons:
-MekSelectorDialog.Search.WeaponsAtLeast=At least
-MekSelectorDialog.Search.Equipment=Has equipment:
+MekSelectorDialog.Search.WeaponClass=Weapon Type
+MekSelectorDialog.Search.Weapons=Weapons
+MekSelectorDialog.Search.Equipment=Equipment
MekSelectorDialog.Search.Year=Design year:
MekSelectorDialog.Search.TableFilters=Table filters:
MekSelectorDialog.Search.UnitType=Unit Type:
MekSelectorDialog.Search.TechClass=Tech Class:
MekSelectorDialog.Search.TechLevel=Tech Level:
+MekSelectorDialog.Search.TableFilter=Filter Text:
MekSelectorDialog.Search.Quirk=Quirk:
MekSelectorDialog.Search.Quirks=Quirks
MekSelectorDialog.Search.WeaponQuirk=Weapon Quirk:
diff --git a/megamek/src/megamek/client/ui/swing/unitSelector/ASAdvancedSearchPanel.java b/megamek/src/megamek/client/ui/advancedsearch/ASAdvancedSearchPanel.java
similarity index 99%
rename from megamek/src/megamek/client/ui/swing/unitSelector/ASAdvancedSearchPanel.java
rename to megamek/src/megamek/client/ui/advancedsearch/ASAdvancedSearchPanel.java
index fe8122671e..3bd85a60c8 100644
--- a/megamek/src/megamek/client/ui/swing/unitSelector/ASAdvancedSearchPanel.java
+++ b/megamek/src/megamek/client/ui/advancedsearch/ASAdvancedSearchPanel.java
@@ -16,7 +16,7 @@
* You should have received a copy of the GNU General Public License
* along with MegaMek. If not, see .
*/
-package megamek.client.ui.swing.unitSelector;
+package megamek.client.ui.advancedsearch;
import java.awt.BasicStroke;
import java.awt.Dimension;
diff --git a/megamek/src/megamek/client/ui/swing/dialog/AdvancedSearchDialog2.java b/megamek/src/megamek/client/ui/advancedsearch/AdvancedSearchDialog2.java
similarity index 73%
rename from megamek/src/megamek/client/ui/swing/dialog/AdvancedSearchDialog2.java
rename to megamek/src/megamek/client/ui/advancedsearch/AdvancedSearchDialog2.java
index 9686f079e6..e6e69f5885 100644
--- a/megamek/src/megamek/client/ui/swing/dialog/AdvancedSearchDialog2.java
+++ b/megamek/src/megamek/client/ui/advancedsearch/AdvancedSearchDialog2.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved.
+ * Copyright (c) 2022-2024 - The MegaMek Team. All Rights Reserved.
*
* This file is part of MegaMek.
*
@@ -16,15 +16,17 @@
* You should have received a copy of the GNU General Public License
* along with MegaMek. If not, see .
*/
-package megamek.client.ui.swing.dialog;
+package megamek.client.ui.advancedsearch;
+import megamek.client.ui.Messages;
import megamek.client.ui.baseComponents.AbstractButtonDialog;
-import megamek.client.ui.swing.unitSelector.ASAdvancedSearchPanel;
-import megamek.client.ui.swing.unitSelector.TWAdvancedSearchPanel;
-import megamek.client.ui.swing.util.UIUtil;
+import megamek.client.ui.swing.ButtonEsc;
+import megamek.client.ui.swing.CloseAction;
+import megamek.client.ui.swing.dialog.DialogButton;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
+import javax.swing.border.MatteBorder;
import java.awt.*;
/**
@@ -68,16 +70,23 @@ protected void cancelAction() {
@Override
protected JPanel createButtonPanel() {
- JPanel buttonPanel = super.createButtonPanel();
- buttonPanel.setLayout(new FlowLayout());
- buttonPanel.setBorder(new EmptyBorder(5, 0, 5, 0));
+ JButton cancelButton = new ButtonEsc(new CloseAction(this));
+ JButton okButton = new DialogButton(Messages.getString("Ok.text"));
+ okButton.addActionListener(this::okButtonActionPerformed);
+ getRootPane().setDefaultButton(okButton);
+
+ JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 20, 0));
+ buttonPanel.setBorder(BorderFactory.createCompoundBorder(
+ new MatteBorder(1, 0, 0, 0, UIManager.getColor("Separator.foreground")),
+ new EmptyBorder(10, 0, 10, 0)));
+ buttonPanel.add(okButton);
+ buttonPanel.add(cancelButton);
return buttonPanel;
}
@Override
protected Container createCenterPane() {
- JScrollPane advScrollpane = new JScrollPane(advancedSearchPane);
- return advScrollpane;
+ return advancedSearchPane;
}
/** Deactivates the search fields in both search tabs so that no units are filtered out. */
diff --git a/megamek/src/megamek/client/ui/advancedsearch/AndFilterToken.java b/megamek/src/megamek/client/ui/advancedsearch/AndFilterToken.java
new file mode 100644
index 0000000000..428cb81d70
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/AndFilterToken.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import megamek.common.MekSearchFilter;
+
+public class AndFilterToken extends OperatorFT {
+
+ public AndFilterToken() {
+ super(MekSearchFilter.BoolOp.AND);
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/EquipmentFilterToken.java b/megamek/src/megamek/client/ui/advancedsearch/EquipmentFilterToken.java
new file mode 100644
index 0000000000..b40b767108
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/EquipmentFilterToken.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+
+package megamek.client.ui.advancedsearch;
+
+public class EquipmentFilterToken implements FilterToken {
+
+
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/EquipmentTableModel.java b/megamek/src/megamek/client/ui/advancedsearch/EquipmentTableModel.java
new file mode 100644
index 0000000000..f94005fd3f
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/EquipmentTableModel.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import megamek.common.EquipmentType;
+import megamek.common.TechConstants;
+
+import javax.swing.table.AbstractTableModel;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * A table model for the advanced search weapon tab's equipment list
+ */
+public class EquipmentTableModel extends AbstractTableModel {
+
+ static final int COL_QTY = 0;
+ static final int COL_NAME = 1;
+ static final int COL_COST = 2;
+ static final int COL_IS_CLAN = 3;
+ static final int COL_LEVEL = 4;
+ static final int N_COL = 5;
+ static final int COL_INTERNAL_NAME = 5;
+
+ private final TWAdvancedSearchPanel twAdvancedSearchPanel;
+ private int[] qty;
+ private List equipment = new ArrayList<>();
+
+ public EquipmentTableModel(TWAdvancedSearchPanel twAdvancedSearchPanel) {
+ this.twAdvancedSearchPanel = twAdvancedSearchPanel;
+ }
+
+ @Override
+ public int getRowCount() {
+ return equipment.size();
+ }
+
+ @Override
+ public int getColumnCount() {
+ return N_COL;
+ }
+
+ public int getPreferredWidth(int col) {
+ return switch (col) {
+ case COL_QTY -> 40;
+ case COL_NAME -> 400;
+ case COL_IS_CLAN -> 75;
+ case COL_COST -> 175;
+ case COL_LEVEL -> 100;
+ default -> 0;
+ };
+ }
+
+ @Override
+ public String getColumnName(int column) {
+ return switch (column) {
+ case COL_QTY -> "Qty";
+ case COL_NAME -> "Name";
+ case COL_IS_CLAN -> "IS/Clan";
+ case COL_COST -> "Cost";
+ case COL_LEVEL -> "Lvl";
+ default -> "?";
+ };
+ }
+
+ @Override
+ public Class> getColumnClass(int c) {
+ return getValueAt(0, c).getClass();
+ }
+
+ @Override
+ public boolean isCellEditable(int row, int col) {
+ return col == COL_QTY;
+ }
+
+ public void setData(List eq) {
+ equipment = eq;
+ qty = new int[eq.size()];
+ Arrays.fill(qty, 1);
+ fireTableDataChanged();
+ }
+
+ public EquipmentType getEquipmentTypeAt(int row) {
+ return equipment.get(row);
+ }
+
+ @Override
+ public Object getValueAt(int row, int col) {
+ if (row >= equipment.size()) {
+ return null;
+ }
+ EquipmentType eq = equipment.get(row);
+ return switch (col) {
+ case COL_QTY -> qty[row] + "";
+ case COL_NAME -> eq.getName();
+ case COL_IS_CLAN -> TechConstants.getTechName(eq.getTechLevel(twAdvancedSearchPanel.gameYear));
+ case COL_COST -> eq.getRawCost();
+ case COL_LEVEL -> TechConstants.getSimpleLevelName(
+ TechConstants.convertFromNormalToSimple(eq.getTechLevel(twAdvancedSearchPanel.gameYear)));
+ case COL_INTERNAL_NAME -> eq.getInternalName();
+ default -> "?";
+ };
+ }
+
+ @Override
+ public void setValueAt(Object value, int row, int col) {
+ if (col == COL_QTY) {
+ qty[row] = Integer.parseInt((String) value);
+ fireTableCellUpdated(row, col);
+ }
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/EquipmentTypeFT.java b/megamek/src/megamek/client/ui/advancedsearch/EquipmentTypeFT.java
new file mode 100644
index 0000000000..7f7f8294e9
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/EquipmentTypeFT.java
@@ -0,0 +1,24 @@
+package megamek.client.ui.advancedsearch;
+
+/**
+ * FilterTokens subclass that represents equipment.
+ *
+ * @author Arlith
+ */
+public class EquipmentTypeFT extends EquipmentFilterToken {
+
+ public String internalName;
+ public String fullName;
+ public int qty;
+
+ public EquipmentTypeFT(String in, String fn, int q) {
+ internalName = in;
+ fullName = fn;
+ qty = q;
+ }
+
+ @Override
+ public String toString() {
+ return qty + " " + fullName + ((qty != 1) ? "s" : "");
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/FilterToken.java b/megamek/src/megamek/client/ui/advancedsearch/FilterToken.java
new file mode 100644
index 0000000000..17ece989cc
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/FilterToken.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+/**
+ * Marker interface for different tokens that can be in a filter expression.
+ *
+ * @author Arlith
+ */
+public interface FilterToken {
+
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/LeftParensFilterToken.java b/megamek/src/megamek/client/ui/advancedsearch/LeftParensFilterToken.java
new file mode 100644
index 0000000000..da69edea0e
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/LeftParensFilterToken.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+public class LeftParensFilterToken extends ParensFT {
+
+ public LeftParensFilterToken() {
+ super("(");
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/MiscSearchTab.java b/megamek/src/megamek/client/ui/advancedsearch/MiscSearchTab.java
new file mode 100644
index 0000000000..071b9177cf
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/MiscSearchTab.java
@@ -0,0 +1,430 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import megamek.client.ui.Messages;
+import megamek.common.*;
+import megamek.common.equipment.ArmorType;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.List;
+import java.util.Map;
+
+public class MiscSearchTab extends JPanel {
+
+ JButton btnBaseClear = new JButton(Messages.getString("MekSelectorDialog.ClearTab"));
+ JLabel lblWalk = new JLabel(Messages.getString("MekSelectorDialog.Search.Walk"));
+ JTextField tStartWalk = new JTextField(4);
+ JTextField tEndWalk = new JTextField(4);
+ JLabel lblJump = new JLabel(Messages.getString("MekSelectorDialog.Search.Jump"));
+ JTextField tStartJump = new JTextField(4);
+ JTextField tEndJump = new JTextField(4);
+ JLabel lblTankTurrets = new JLabel(Messages.getString("MekSelectorDialog.Search.TankTurrets"));
+ JTextField tStartTankTurrets = new JTextField(4);
+ JTextField tEndTankTurrets= new JTextField(4);
+ JLabel lblLowerArms = new JLabel(Messages.getString("MekSelectorDialog.Search.LowerArms"));
+ JTextField tStartLowerArms = new JTextField(4);
+ JTextField tEndLowerArms = new JTextField(4);
+ JLabel lblHands = new JLabel(Messages.getString("MekSelectorDialog.Search.Hands"));
+ JTextField tStartHands = new JTextField(4);
+ JTextField tEndHands = new JTextField(4);
+ JLabel lblArmor = new JLabel(Messages.getString("MekSelectorDialog.Search.Armor"));
+ JComboBox cArmor = new JComboBox<>();
+ JLabel lblOfficial = new JLabel(Messages.getString("MekSelectorDialog.Search.Official"));
+ JComboBox cOfficial = new JComboBox<>();
+ JLabel lblCanon = new JLabel(Messages.getString("MekSelectorDialog.Search.Canon"));
+ JComboBox cCanon = new JComboBox<>();
+ JLabel lblPatchwork = new JLabel(Messages.getString("MekSelectorDialog.Search.Patchwork"));
+ JComboBox cPatchwork = new JComboBox<>();
+ JLabel lblInvalid = new JLabel(Messages.getString("MekSelectorDialog.Search.Invalid"));
+ JComboBox cInvalid = new JComboBox<>();
+ JLabel lblFailedToLoadEquipment = new JLabel(Messages.getString("MekSelectorDialog.Search.FailedToLoadEquipment"));
+ JComboBox cFailedToLoadEquipment = new JComboBox<>();
+ JLabel lblClanEngine = new JLabel(Messages.getString("MekSelectorDialog.Search.ClanEngine"));
+ JComboBox cClanEngine = new JComboBox<>();
+ JLabel lblSource = new JLabel(Messages.getString("MekSelectorDialog.Search.Source"));
+ JTextField tSource = new JTextField(4);
+ JLabel lblMULId = new JLabel(Messages.getString("MekSelectorDialog.Search.MULId"));
+ JTextField tMULId = new JTextField(4);
+ JLabel lblYear = new JLabel(Messages.getString("MekSelectorDialog.Search.Year"));
+ JTextField tStartYear = new JTextField(4);
+ JTextField tEndYear = new JTextField(4);
+ JLabel lblTons = new JLabel(Messages.getString("MekSelectorDialog.Search.Tons"));
+ JTextField tStartTons = new JTextField(4);
+ JTextField tEndTons = new JTextField(4);
+ JLabel lblBV = new JLabel(Messages.getString("MekSelectorDialog.Search.BV"));
+ JTextField tStartBV = new JTextField(4);
+ JTextField tEndBV = new JTextField(4);
+ JLabel lblCockpitType = new JLabel(Messages.getString("MekSelectorDialog.Search.CockpitType"));
+ JList listCockpitType = new JList<>(new DefaultListModel<>());
+ JScrollPane spCockpitType = new JScrollPane(listCockpitType);
+ JLabel lblArmorType = new JLabel(Messages.getString("MekSelectorDialog.Search.ArmorType"));
+ JList listArmorType = new JList<>(new DefaultListModel<>());
+ JScrollPane spArmorType = new JScrollPane(listArmorType);
+ JLabel lblInternalsType = new JLabel(Messages.getString("MekSelectorDialog.Search.InternalsType"));
+ JList listInternalsType = new JList<>(new DefaultListModel<>());
+ JScrollPane spInternalsType = new JScrollPane(listInternalsType);
+ JLabel lblEngineType = new JLabel(Messages.getString("MekSelectorDialog.Search.Engine"));
+ JList listEngineType = new JList<>(new DefaultListModel<>());
+ JScrollPane spEngineType = new JScrollPane(listEngineType);
+ JLabel lblGyroType = new JLabel(Messages.getString("MekSelectorDialog.Search.Gyro"));
+ JList listGyroType = new JList<>(new DefaultListModel<>());
+ JScrollPane spGyroType = new JScrollPane(listGyroType);
+ JLabel lblTechLevel = new JLabel(Messages.getString("MekSelectorDialog.Search.TechLevel"));
+ JList listTechLevel = new JList<>(new DefaultListModel<>());
+ JScrollPane spTechLevel = new JScrollPane(listTechLevel);
+ JLabel lblTechBase = new JLabel(Messages.getString("MekSelectorDialog.Search.TechBase"));
+ JList listTechBase = new JList<>(new DefaultListModel<>());
+ JScrollPane spTechBase = new JScrollPane(listTechBase);
+
+ private JPanel createBaseAttributes() {
+ loadYesNo(cOfficial);
+ loadYesNo(cCanon);
+ loadYesNo(cInvalid);
+ loadYesNo(cFailedToLoadEquipment);
+
+ JPanel baseAttributesPanel = new JPanel();
+ GridBagConstraints c = new GridBagConstraints();
+ baseAttributesPanel.setLayout(new GridBagLayout());
+
+ c.weighty = 0;
+ c.anchor = GridBagConstraints.NORTHWEST;
+ c.fill = GridBagConstraints.NONE;
+ c.gridwidth = 1;
+ c.insets = new Insets(20, 10, 0, 0);
+ c.gridx = 0; c.gridy = 0;
+
+ JPanel p0Panel = new JPanel();
+ p0Panel.add(lblOfficial);
+ p0Panel.add(cOfficial);
+ p0Panel.add(lblCanon);
+ p0Panel.add(cCanon);
+ baseAttributesPanel.add(p0Panel, c);
+ c.fill = GridBagConstraints.HORIZONTAL;
+ c.gridx = 1;
+ JPanel sPanel = new JPanel(new BorderLayout());
+ sPanel.add(lblSource, BorderLayout.WEST);
+ sPanel.add(tSource, BorderLayout.CENTER);
+ baseAttributesPanel.add(sPanel, c);
+ c.gridx = 2;
+ JPanel mPanel = new JPanel(new BorderLayout());
+ mPanel.add(lblMULId, BorderLayout.WEST);
+ mPanel.add(tMULId, BorderLayout.CENTER);
+ baseAttributesPanel.add(mPanel, c);
+
+ c.fill = GridBagConstraints.NONE;
+ c.insets = new Insets(5, 10, 0, 0);
+ c.gridx = 0; c.gridy++;
+ JPanel yearPanel = new JPanel();
+ yearPanel.add(lblYear);
+ yearPanel.add(tStartYear);
+ yearPanel.add(new JLabel("-"));
+ yearPanel.add(tEndYear);
+ baseAttributesPanel.add(yearPanel, c);
+ c.gridx = 1;
+ JPanel p1bPanel = new JPanel();
+ p1bPanel.add(lblFailedToLoadEquipment);
+ p1bPanel.add(cFailedToLoadEquipment);
+ baseAttributesPanel.add(p1bPanel, c);
+ c.gridx = 2;
+ JPanel p1cPanel = new JPanel();
+ p1cPanel.add(lblInvalid);
+ p1cPanel.add(cInvalid);
+ baseAttributesPanel.add(p1cPanel, c);
+
+ c.gridx = 0; c.gridy++;
+ JPanel bvPanel = new JPanel();
+ bvPanel.add(lblBV);
+ bvPanel.add(tStartBV);
+ bvPanel.add(new JLabel("-"));
+ bvPanel.add(tEndBV);
+ baseAttributesPanel.add(bvPanel, c);
+ c.gridx = 1;
+ JPanel tonsPanel = new JPanel();
+ tonsPanel.add(lblTons);
+ tonsPanel.add(tStartTons);
+ tonsPanel.add(new JLabel("-"));
+ tonsPanel.add(tEndTons);
+ baseAttributesPanel.add(tonsPanel, c);
+
+ c.gridx = 0; c.gridy++;
+ JPanel walkPanel = new JPanel();
+ walkPanel.add(lblWalk);
+ walkPanel.add(tStartWalk);
+ walkPanel.add(new JLabel("-"));
+ walkPanel.add(tEndWalk);
+ baseAttributesPanel.add(walkPanel, c);
+ c.gridx = 1;
+ JPanel jumpPanel = new JPanel();
+ jumpPanel.add(lblJump);
+ jumpPanel.add(tStartJump);
+ jumpPanel.add(new JLabel("-"));
+ jumpPanel.add(tEndJump);
+ baseAttributesPanel.add(jumpPanel, c);
+
+ c.gridx = 0; c.gridy++;
+ JPanel lowerArmsPanel = new JPanel();
+ lowerArmsPanel.add(lblLowerArms);
+ lowerArmsPanel.add(tStartLowerArms);
+ lowerArmsPanel.add(new JLabel("-"));
+ lowerArmsPanel.add(tEndLowerArms);
+ baseAttributesPanel.add(lowerArmsPanel, c);
+ c.gridx = 1;
+ JPanel handsPanel = new JPanel();
+ handsPanel.add(lblHands);
+ handsPanel.add(tStartHands);
+ handsPanel.add(new JLabel("-"));
+ handsPanel.add(tEndHands);
+ baseAttributesPanel.add(handsPanel, c);
+
+ c.gridx = 0; c.gridy++;
+ JPanel p2Panel = new JPanel();
+ p2Panel.add(lblTankTurrets);
+ p2Panel.add(tStartTankTurrets);
+ p2Panel.add(new JLabel("-"));
+ p2Panel.add(tEndTankTurrets);
+ baseAttributesPanel.add(p2Panel, c);
+ c.gridx = 1;
+ JPanel armorPanel = new JPanel();
+ armorPanel.add(lblArmor);
+ armorPanel.add(cArmor);
+ baseAttributesPanel.add(armorPanel, c);
+
+ return baseAttributesPanel;
+ }
+
+ private void loadYesNo(JComboBox cb) {
+ cb.addItem(Messages.getString("MekSelectorDialog.Search.Any"));
+ cb.addItem(Messages.getString("MekSelectorDialog.Search.Yes"));
+ cb.addItem(Messages.getString("MekSelectorDialog.Search.No"));
+ }
+
+ private JPanel createBaseComboBoxes() {
+ cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Any"));
+ cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor25"));
+ cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor50"));
+ cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor75"));
+ cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor90"));
+
+ loadYesNo(cClanEngine);
+ loadYesNo(cPatchwork);
+
+ loadTriStateItem(ArmorType.getAllArmorCodeName(), listArmorType, 5);
+ loadTriStateItem(Mek.getAllCockpitCodeName(), listCockpitType, 7);
+ loadTriStateItem(EquipmentType.getAllStructureCodeName(), listInternalsType, 7);
+ loadTriStateItem(Engine.getAllEngineCodeName(), listEngineType, 5);
+ loadTriStateItem(Entity.getAllGyroCodeName(), listGyroType, 7);
+ loadTriStateItem(SimpleTechLevel.getAllSimpleTechLevelCodeName(), listTechLevel, 5);
+ loadTriStateItem(Entity.getTechBaseDescriptions(), listTechBase, 4);
+
+ JPanel baseComboBoxesPanel = new JPanel();
+ GridBagConstraints c = new GridBagConstraints();
+ baseComboBoxesPanel.setLayout(new GridBagLayout());
+
+ c.weighty = 0;
+ c.anchor = GridBagConstraints.NORTHWEST;
+ c.fill = GridBagConstraints.NONE;
+ c.gridwidth = 1;
+ c.insets = new Insets(5, 10, 0, 0);
+ c.gridx = 0; c.gridy = 0;
+
+ JPanel cockpitPanel = new JPanel(new BorderLayout());
+ cockpitPanel.add(lblCockpitType, BorderLayout.NORTH);
+ cockpitPanel.add(spCockpitType, BorderLayout.CENTER);
+ baseComboBoxesPanel.add(cockpitPanel, c);
+ c.gridx = 1;
+ JPanel enginePanel = new JPanel(new BorderLayout());
+ enginePanel.add(lblEngineType, BorderLayout.NORTH);
+ enginePanel.add(spEngineType, BorderLayout.CENTER);
+ JPanel clanEnginePanel = new JPanel();
+ clanEnginePanel.add(lblClanEngine);
+ clanEnginePanel.add(cClanEngine);
+ enginePanel.add(clanEnginePanel, BorderLayout.SOUTH);
+ baseComboBoxesPanel.add(enginePanel, c);
+ c.gridx = 2;
+ JPanel gyroPanel = new JPanel(new BorderLayout());
+ gyroPanel.add(lblGyroType, BorderLayout.NORTH);
+ gyroPanel.add(spGyroType, BorderLayout.CENTER);
+ baseComboBoxesPanel.add(gyroPanel, c);
+
+ c.gridx = 0; c.gridy++;
+ JPanel armorTypePanel = new JPanel(new BorderLayout());
+ armorTypePanel.add(lblArmorType, BorderLayout.NORTH);
+ armorTypePanel.add(spArmorType, BorderLayout.CENTER);
+ JPanel patchworkPanel = new JPanel();
+ patchworkPanel.add(lblPatchwork);
+ patchworkPanel.add(cPatchwork);
+ armorTypePanel.add(patchworkPanel, BorderLayout.SOUTH);
+ baseComboBoxesPanel.add(armorTypePanel, c);
+ c.gridx = 1;
+ JPanel internalsPanel = new JPanel(new BorderLayout());
+ internalsPanel.add(lblInternalsType, BorderLayout.NORTH);
+ internalsPanel.add(spInternalsType, BorderLayout.CENTER);
+ baseComboBoxesPanel.add(internalsPanel, c);
+
+ c.gridx = 0; c.gridy++;
+ JPanel techLevelPanel = new JPanel(new BorderLayout());
+ techLevelPanel.add(lblTechLevel, BorderLayout.NORTH);
+ techLevelPanel.add(spTechLevel, BorderLayout.CENTER);
+ baseComboBoxesPanel.add(techLevelPanel, c);
+ c.gridx = 1;
+ JPanel techBasePanel = new JPanel(new BorderLayout());
+ techBasePanel.add(lblTechBase, BorderLayout.NORTH);
+ techBasePanel.add(spTechBase, BorderLayout.CENTER);
+ baseComboBoxesPanel.add(techBasePanel, c);
+
+ return baseComboBoxesPanel;
+ }
+
+ MiscSearchTab() {
+ btnBaseClear.addActionListener(e -> clear());
+
+ GridBagConstraints c = new GridBagConstraints();
+ setLayout(new GridBagLayout());
+
+ c.weighty = 0;
+ c.anchor = GridBagConstraints.NORTHWEST;
+ c.fill = GridBagConstraints.NONE;
+ c.gridwidth = 1;
+ c.insets = new Insets(20, 10, 0, 0);
+ c.gridx = 0; c.gridy = 0;
+
+ add(createBaseAttributes(), c);
+ c.gridx = 0; c.gridy++;
+ add(createBaseComboBoxes(), c);
+
+ c.weighty = 1;
+ JPanel clearPanel = new JPanel();
+ c.gridx = 0; c.gridy++;
+ clearPanel.add(btnBaseClear, c);
+ add(clearPanel, c);
+ }
+
+ private void loadTriStateItem(List s, JList l, int count) {
+ DefaultListModel dlma = new DefaultListModel<>();
+
+ for (String desc : s) {
+ dlma.addElement(new TriStateItem("\u2610", desc));
+ }
+
+ l.setModel(dlma);
+ l.setVisibleRowCount(count);
+ jListSetup(l);
+ }
+
+ private void loadTriStateItem(Map s, JList l, int count) {
+ DefaultListModel dlma = new DefaultListModel<>();
+
+ for (Map.Entry desc : s.entrySet()) {
+ dlma.addElement(new TriStateItem("\u2610", desc.getKey(), desc.getValue()));
+ }
+
+ l.setModel(dlma);
+ l.setVisibleRowCount(count);
+ jListSetup(l);
+ }
+
+ private void jListSetup(JList l) {
+ l.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ l.setSelectionModel(new NoSelectionModel());
+ l.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ super.mouseClicked(e);
+ if (e.getButton() == MouseEvent.BUTTON1) {
+ JList list = (JList) e.getSource();
+ int index = list.locationToIndex(e.getPoint());
+ toggleText(list, index);
+ }
+ }
+ });
+ }
+
+ private void toggleText(JList list, int index) {
+ ListModel m = list.getModel();
+
+ for (int i = 0; i < m.getSize(); i++) {
+ TriStateItem ms = m.getElementAt(i);
+
+ if (index == i) {
+ if (ms.state.contains("\u2610")) {
+ ms.state = "\u2611";
+ } else if (ms.state.contains("\u2611")) {
+ ms.state = "\u2612";
+ } else if (ms.state.contains("\u2612")) {
+ ms.state = "\u2610";
+ }
+ }
+ }
+
+ list.setModel(m);
+ list.repaint();
+ }
+
+ void clear() {
+ tStartWalk.setText("");
+ tEndWalk.setText("");
+ tStartJump.setText("");
+ tEndJump.setText("");
+ cArmor.setSelectedIndex(0);
+ cOfficial.setSelectedIndex(0);
+ cCanon.setSelectedIndex(0);
+ cPatchwork.setSelectedIndex(0);
+ cInvalid.setSelectedIndex(0);
+ cFailedToLoadEquipment.setSelectedIndex(0);
+ cClanEngine.setSelectedIndex(0);
+ tStartTankTurrets.setText("");
+ tEndTankTurrets.setText("");
+ tStartLowerArms.setText("");
+ tEndLowerArms.setText("");
+ tStartHands.setText("");
+ tEndHands.setText("");
+ tStartYear.setText("");
+ tEndYear.setText("");
+ tStartTons.setText("");
+ tEndTons.setText("");
+ tStartBV.setText("");
+ tEndBV.setText("");
+ tSource.setText("");
+ tMULId.setText("");
+
+ clearTriStateItem(listArmorType);
+ clearTriStateItem(listCockpitType);
+ clearTriStateItem(listEngineType);
+ clearTriStateItem(listGyroType);
+ clearTriStateItem(listInternalsType);
+ clearTriStateItem(listTechLevel);
+ clearTriStateItem(listTechBase);
+ }
+
+ void clearTriStateItem(JList l) {
+ ListModel m = l.getModel();
+
+ for (int i = 0; i < m.getSize(); i++) {
+ TriStateItem ms = m.getElementAt(i);
+ ms.state = "\u2610";
+ }
+
+ l.setModel(m);
+ l.repaint();
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/NoSelectionModel.java b/megamek/src/megamek/client/ui/advancedsearch/NoSelectionModel.java
new file mode 100644
index 0000000000..5b2a0f4d6b
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/NoSelectionModel.java
@@ -0,0 +1,21 @@
+package megamek.client.ui.advancedsearch;
+
+import javax.swing.*;
+
+class NoSelectionModel extends DefaultListSelectionModel {
+ @Override
+ public void setAnchorSelectionIndex(final int anchorIndex) {
+ }
+
+ @Override
+ public void setLeadAnchorNotificationEnabled(final boolean flag) {
+ }
+
+ @Override
+ public void setLeadSelectionIndex(final int leadIndex) {
+ }
+
+ @Override
+ public void setSelectionInterval(final int index0, final int index1) {
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/OperatorFT.java b/megamek/src/megamek/client/ui/advancedsearch/OperatorFT.java
new file mode 100644
index 0000000000..769b3e6283
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/OperatorFT.java
@@ -0,0 +1,27 @@
+package megamek.client.ui.advancedsearch;
+
+import megamek.common.MekSearchFilter;
+
+/**
+ * FilterTokens subclass that represents a boolean operation.
+ *
+ * @author Arlith
+ */
+public abstract class OperatorFT implements FilterToken {
+ public MekSearchFilter.BoolOp op;
+
+ protected OperatorFT(MekSearchFilter.BoolOp o) {
+ op = o;
+ }
+
+ @Override
+ public String toString() {
+ if (op == MekSearchFilter.BoolOp.AND) {
+ return "And";
+ } else if (op == MekSearchFilter.BoolOp.OR) {
+ return "Or";
+ } else {
+ return "";
+ }
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/OrFilterToken.java b/megamek/src/megamek/client/ui/advancedsearch/OrFilterToken.java
new file mode 100644
index 0000000000..93c304fd00
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/OrFilterToken.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import megamek.common.MekSearchFilter;
+
+public class OrFilterToken extends OperatorFT {
+
+ public OrFilterToken() {
+ super(MekSearchFilter.BoolOp.OR);
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/ParensFT.java b/megamek/src/megamek/client/ui/advancedsearch/ParensFT.java
new file mode 100644
index 0000000000..b31558a22c
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/ParensFT.java
@@ -0,0 +1,19 @@
+package megamek.client.ui.advancedsearch;
+
+/**
+ * FilterTokens subclass that represents parenthesis.
+ *
+ * @author Arlith
+ */
+public abstract class ParensFT implements FilterToken {
+ public String parens;
+
+ public ParensFT(String p) {
+ parens = p;
+ }
+
+ @Override
+ public String toString() {
+ return parens;
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/QuirksSearchTab.java b/megamek/src/megamek/client/ui/advancedsearch/QuirksSearchTab.java
new file mode 100644
index 0000000000..f117d6e654
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/QuirksSearchTab.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import megamek.client.ui.Messages;
+import megamek.common.options.*;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.stream.Collectors;
+
+class QuirksSearchTab extends JPanel {
+
+ // Quirks
+ JButton btnQuirksClear = new JButton(Messages.getString("MekSelectorDialog.ClearTab"));
+ JLabel lblQuirkInclude = new JLabel("\u2611");
+ JComboBox cQuirkInclue = new JComboBox<>();
+ JLabel lblQuirkExclude = new JLabel("\u2612");
+ JComboBox cQuirkExclude = new JComboBox<>();
+ JLabel lblQuirkType = new JLabel(Messages.getString("MekSelectorDialog.Search.Quirk"));
+ JList listQuirkType = new JList<>(new DefaultListModel<>());
+ JScrollPane spQuirkType = new JScrollPane(listQuirkType);
+ JLabel lblWeaponQuirkInclude = new JLabel("\u2611");
+ JComboBox cWeaponQuirkInclue = new JComboBox<>();
+ JLabel lblWeaponQuirkExclude = new JLabel("\u2612");
+ JComboBox cWeaponQuirkExclude = new JComboBox<>();
+ JLabel lblWeaponQuirkType = new JLabel(Messages.getString("MekSelectorDialog.Search.WeaponQuirk"));
+ JList listWeaponQuirkType = new JList<>(new DefaultListModel<>());
+ JScrollPane spWeaponQuirkType = new JScrollPane(listWeaponQuirkType);
+
+ QuirksSearchTab() {
+ btnQuirksClear.addActionListener(e -> clear());
+
+ loadAndOr(cQuirkInclue, 0);
+ loadAndOr(cQuirkExclude, 1);
+ loadTriStateItem(new Quirks(), listQuirkType, 25);
+
+ loadAndOr(cWeaponQuirkInclue, 0);
+ loadAndOr(cWeaponQuirkExclude, 1);
+ cWeaponQuirkExclude.setSelectedIndex(1);
+
+ loadTriStateItem(new WeaponQuirks(), listWeaponQuirkType, 17);
+
+ GridBagConstraints c = new GridBagConstraints();
+ setLayout(new GridBagLayout());
+
+ c.weighty = 0;
+ c.anchor = GridBagConstraints.NORTHWEST;
+ c.fill = GridBagConstraints.NONE;
+ c.insets = new Insets(20, 10, 0, 0);
+ c.gridx = 0; c.gridy++;
+ JPanel quirkPanel = new JPanel(new BorderLayout());
+ JPanel quirkIEPanel = new JPanel(new FlowLayout());
+ quirkIEPanel.add(lblQuirkType);
+ quirkIEPanel.add(Box.createHorizontalStrut(15));
+ quirkIEPanel.add(lblQuirkInclude);
+ quirkIEPanel.add(cQuirkInclue);
+ quirkIEPanel.add(lblQuirkExclude);
+ quirkIEPanel.add(cQuirkExclude);
+ quirkPanel.add(quirkIEPanel, BorderLayout.NORTH);
+ quirkPanel.add(spQuirkType, BorderLayout.CENTER);
+ add(quirkPanel, c);
+ c.gridx = 1;
+ JPanel weaponQuirkPanel = new JPanel(new BorderLayout());
+ JPanel weaponQuirkIEPanel = new JPanel(new FlowLayout());
+ weaponQuirkIEPanel.add(lblWeaponQuirkType);
+ weaponQuirkIEPanel.add(Box.createHorizontalStrut(15));
+ weaponQuirkIEPanel.add(lblWeaponQuirkInclude);
+ weaponQuirkIEPanel.add(cWeaponQuirkInclue);
+ weaponQuirkIEPanel.add(lblWeaponQuirkExclude);
+ weaponQuirkIEPanel.add(cWeaponQuirkExclude);
+ weaponQuirkPanel.add(weaponQuirkIEPanel, BorderLayout.NORTH);
+ weaponQuirkPanel.add(spWeaponQuirkType, BorderLayout.CENTER);
+ add(weaponQuirkPanel, c);
+ c.weighty = 1;
+ JPanel blankPanel = new JPanel();
+ c.gridx = 0; c.gridy++;
+ blankPanel.add(btnQuirksClear, c);
+ add(blankPanel, c);
+ }
+
+ private void loadAndOr(JComboBox cb, int index) {
+ cb.addItem(Messages.getString("MekSelectorDialog.Search.and"));
+ cb.addItem(Messages.getString("MekSelectorDialog.Search.or"));
+ cb.setSelectedIndex(index);
+ }
+
+ private void loadTriStateItem(AbstractOptions s, JList l, int count) {
+ List qs = new ArrayList<>();
+ for (final Enumeration optionGroups = s.getGroups(); optionGroups.hasMoreElements(); ) {
+ final IOptionGroup group = optionGroups.nextElement();
+ for (final Enumeration options = group.getOptions(); options.hasMoreElements(); ) {
+ final IOption option = options.nextElement();
+ if (option != null) {
+ qs.add(option.getDisplayableNameWithValue());
+ }
+ }
+ }
+ qs = qs.stream().sorted(String.CASE_INSENSITIVE_ORDER).collect(Collectors.toList());
+
+ DefaultListModel dlm = new DefaultListModel<>();
+
+ for (String q : qs) {
+ dlm.addElement(new TriStateItem("\u2610", q));
+ }
+ l.setModel(dlm);
+
+ l.setVisibleRowCount(count);
+ jListSetup(l);
+ }
+
+ private void jListSetup(JList l) {
+ l.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ l.setSelectionModel(new NoSelectionModel());
+ l.addMouseListener(new MouseAdapter() {
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ super.mouseClicked(e);
+ if (e.getButton() == MouseEvent.BUTTON1) {
+ JList list = (JList) e.getSource();
+ int index = list.locationToIndex(e.getPoint());
+ toggleText(list, index);
+ }
+ }
+ });
+ }
+
+ private void toggleText(JList list, int index) {
+ ListModel m = list.getModel();
+
+ for (int i = 0; i < m.getSize(); i++) {
+ TriStateItem ms = m.getElementAt(i);
+
+ if (index == i) {
+ if (ms.state.contains("\u2610")) {
+ ms.state = "\u2611";
+ } else if (ms.state.contains("\u2611")) {
+ ms.state = "\u2612";
+ } else if (ms.state.contains("\u2612")) {
+ ms.state = "\u2610";
+ }
+ }
+ }
+
+ list.setModel(m);
+ list.repaint();
+ }
+
+ void clear() {
+ cQuirkInclue.setSelectedIndex(0);
+ cQuirkExclude.setSelectedIndex(1);
+ clearTriStateItem(listQuirkType);
+
+ cWeaponQuirkInclue.setSelectedIndex(0);
+ cWeaponQuirkExclude.setSelectedIndex(1);
+ clearTriStateItem(listWeaponQuirkType);
+ }
+
+ void clearTriStateItem(JList l) {
+ ListModel m = l.getModel();
+
+ for (int i = 0; i < m.getSize(); i++) {
+ TriStateItem ms = m.getElementAt(i);
+ ms.state = "\u2610";
+ }
+
+ l.setModel(m);
+ l.repaint();
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/RightParensFilterToken.java b/megamek/src/megamek/client/ui/advancedsearch/RightParensFilterToken.java
new file mode 100644
index 0000000000..73c48c889b
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/RightParensFilterToken.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+public class RightParensFilterToken extends ParensFT {
+
+ public RightParensFilterToken() {
+ super(")");
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/TWAdvancedSearchPanel.java b/megamek/src/megamek/client/ui/advancedsearch/TWAdvancedSearchPanel.java
new file mode 100644
index 0000000000..66ff10426e
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/TWAdvancedSearchPanel.java
@@ -0,0 +1,373 @@
+/*
+ * Copyright (c) 2002, 2003 Ben Mazur (bmazur@sev.org)
+ * Copyright (c) 2022-2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import java.awt.*;
+import java.util.List;
+
+import javax.swing.*;
+
+import com.formdev.flatlaf.extras.components.FlatTriStateCheckBox;
+import megamek.client.ui.Messages;
+import megamek.common.*;
+
+/**
+ * Panel that allows the user to create a unit filter.
+ *
+ * @author Arlith
+ * @author Jay Lawson
+ * @author Simon (Juliez)
+ */
+public class TWAdvancedSearchPanel extends JTabbedPane {
+
+ public MekSearchFilter mekFilter = new MekSearchFilter();
+
+ int gameYear;
+
+ private final UnitTypeSearchTab unitTypePanel;
+ private final MiscSearchTab basePanel;
+ private final QuirksSearchTab quirkPanel;
+ private final TransportsSearchTab transportsPanel;
+ private final WeaponSearchTab weaponEqPanel;
+
+ private boolean isCanceled = true;
+
+ /**
+ * Constructs a new advanced search panel for Total Warfare values
+ */
+ public TWAdvancedSearchPanel(int year) {
+ gameYear = year;
+
+ basePanel = new MiscSearchTab();
+ weaponEqPanel = new WeaponSearchTab(this);
+ unitTypePanel = new UnitTypeSearchTab();
+ quirkPanel = new QuirksSearchTab();
+ transportsPanel = new TransportsSearchTab();
+
+ String msg_base = Messages.getString("MekSelectorDialog.Search.Base");
+ String msg_weaponEq = Messages.getString("MekSelectorDialog.Search.WeaponEq");
+ String msg_unitType = Messages.getString("MekSelectorDialog.Search.unitType");
+ String msg_quirkType = Messages.getString("MekSelectorDialog.Search.Quirks");
+ String msg_transports = Messages.getString("MekSelectorDialog.Search.Transports");
+
+ addTab(msg_unitType, new StandardScrollPane(unitTypePanel));
+ addTab(msg_base, new StandardScrollPane(basePanel));
+ // The weapon panel must manage its own scrollpane!
+ addTab(msg_weaponEq, weaponEqPanel);
+ addTab(msg_transports, new StandardScrollPane(transportsPanel));
+ addTab(msg_quirkType, new StandardScrollPane(quirkPanel));
+ }
+
+ /**
+ * Show the dialog. setVisible(true) blocks until setVisible(false).
+ *
+ * @return Return the filter that was created with this dialog.
+ */
+ public MekSearchFilter showDialog() {
+ // We need to save a copy since the user can alter the filter state
+ // and then click on the cancel button. We want to make sure the
+ // original filter state is saved.
+ MekSearchFilter currFilter = mekFilter;
+ mekFilter = new MekSearchFilter(currFilter);
+ weaponEqPanel.txtWEEqExp.setText(mekFilter.getEquipmentExpression());
+ weaponEqPanel.adaptTokenButtons();
+ setVisible(true);
+ if (isCanceled) {
+ mekFilter = currFilter;
+ } else {
+ updateMekSearchFilter();
+ }
+ return mekFilter;
+ }
+
+ public void prepareFilter() {
+ try {
+ mekFilter = new MekSearchFilter(mekFilter);
+ mekFilter.createFilterExpressionFromTokens(weaponEqPanel.filterTokens);
+ updateMekSearchFilter();
+ } catch (MekSearchFilter.FilterParsingException e) {
+ JOptionPane.showMessageDialog(this,
+ "Error parsing filter expression!\n\n" + e.msg,
+ "Filter Expression Parsing Error",
+ JOptionPane.ERROR_MESSAGE);
+ }
+ }
+
+ public void clearValues() {
+ mekFilter = null;
+ unitTypePanel.clear();
+ basePanel.clear();
+ transportsPanel.clear();
+ quirkPanel.clear();
+ weaponEqPanel.clear();
+ }
+
+ public MekSearchFilter getMekSearchFilter() {
+ return mekFilter;
+ }
+
+ private void updateTriStateItemString(List include, List exclude, JList l) {
+ ListModel m = l.getModel();
+
+ for (int i = 0; i < m.getSize(); i++) {
+ TriStateItem ms = m.getElementAt(i);
+ if (ms.state.contains("\u2611")) {
+ include.add(ms.text);
+ } else if (ms.state.contains("\u2612")) {
+ exclude.add(ms.text);
+ }
+ }
+ }
+
+ private void updateTriStateItem(List include, List exclude, JList l) {
+ ListModel m = l.getModel();
+
+ for (int i = 0; i < m.getSize(); i++) {
+ TriStateItem ms = m.getElementAt(i);
+ if (ms.state.contains("\u2611")) {
+ include.add(ms.code);
+
+ } else if (ms.state.contains("\u2612")) {
+ exclude.add(ms.code);
+ }
+ }
+ }
+
+ private void updateBase() {
+ mekFilter.sStartWalk = basePanel.tStartWalk.getText();
+ mekFilter.sEndWalk = basePanel.tEndWalk.getText();
+
+ mekFilter.sStartJump = basePanel.tStartJump.getText();
+ mekFilter.sEndJump = basePanel.tEndJump.getText();
+
+ mekFilter.iArmor = basePanel.cArmor.getSelectedIndex();
+
+ mekFilter.sStartTankTurrets = basePanel.tStartTankTurrets.getText();
+ mekFilter.sEndTankTurrets = basePanel.tEndTankTurrets.getText();
+ mekFilter.sStartLowerArms = basePanel.tStartLowerArms.getText();
+ mekFilter.sEndLowerArms = basePanel.tEndLowerArms.getText();
+ mekFilter.sStartHands = basePanel.tStartHands.getText();
+ mekFilter.sEndHands = basePanel.tEndHands.getText();
+
+ mekFilter.iOfficial = basePanel.cOfficial.getSelectedIndex();
+ mekFilter.iCanon = basePanel.cCanon.getSelectedIndex();
+ mekFilter.iInvalid = basePanel.cInvalid.getSelectedIndex();
+ mekFilter.iFailedToLoadEquipment = basePanel.cFailedToLoadEquipment.getSelectedIndex();
+ mekFilter.iClanEngine = basePanel.cClanEngine.getSelectedIndex();
+ mekFilter.iPatchwork = basePanel.cPatchwork.getSelectedIndex();
+
+ mekFilter.source = basePanel.tSource.getText();
+ mekFilter.mulid = basePanel.tMULId.getText();
+
+ mekFilter.sStartYear = basePanel.tStartYear.getText();
+ mekFilter.sEndYear = basePanel.tEndYear.getText();
+
+ mekFilter.sStartTons = basePanel.tStartTons.getText();
+ mekFilter.sEndTons = basePanel.tEndTons.getText();
+
+ mekFilter.sStartBV = basePanel.tStartBV.getText();
+ mekFilter.sEndBV = basePanel.tEndBV.getText();
+
+ updateTriStateItem(mekFilter.armorType, mekFilter.armorTypeExclude, basePanel.listArmorType);
+ updateTriStateItem(mekFilter.cockpitType, mekFilter.cockpitTypeExclude, basePanel.listCockpitType);
+ updateTriStateItem(mekFilter.internalsType, mekFilter.internalsTypeExclude, basePanel.listInternalsType);
+ updateTriStateItem(mekFilter.engineType, mekFilter.engineTypeExclude, basePanel.listEngineType);
+ updateTriStateItem(mekFilter.gyroType, mekFilter.gyroTypeExclude, basePanel.listGyroType);
+ updateTriStateItem(mekFilter.techLevel, mekFilter.techLevelExclude, basePanel.listTechLevel);
+ updateTriStateItemString(mekFilter.techBase, mekFilter.techBaseExclude, basePanel.listTechBase);
+ }
+
+ private void updateTransports() {
+ mekFilter.sStartTroopSpace = transportsPanel.tStartTroopSpace.getText();
+ mekFilter.sEndTroopSpace = transportsPanel.tEndTroopSpace.getText();
+
+ mekFilter.sStartASFBays = transportsPanel.tStartASFBays.getText();
+ mekFilter.sEndASFBays = transportsPanel.tEndASFBays.getText();
+ mekFilter.sStartASFDoors = transportsPanel.tStartASFDoors.getText();
+ mekFilter.sEndASFDoors = transportsPanel.tEndASFDoors.getText();
+ mekFilter.sStartASFUnits = transportsPanel.tStartASFUnits.getText();
+ mekFilter.sEndASFUnits = transportsPanel.tEndASFUnits.getText();
+
+ mekFilter.sStartSmallCraftBays = transportsPanel.tStartSmallCraftBays.getText();
+ mekFilter.sEndSmallCraftBays = transportsPanel.tEndSmallCraftBays.getText();
+ mekFilter.sStartSmallCraftDoors = transportsPanel.tStartSmallCraftDoors.getText();
+ mekFilter.sEndSmallCraftDoors = transportsPanel.tEndSmallCraftDoors.getText();
+ mekFilter.sStartSmallCraftUnits = transportsPanel.tStartSmallCraftUnits.getText();
+ mekFilter.sEndSmallCraftUnits = transportsPanel.tEndSmallCraftUnits.getText();
+
+ mekFilter.sStartMekBays = transportsPanel.tStartMekBays.getText();
+ mekFilter.sEndMekBays = transportsPanel.tEndMekBays.getText();
+ mekFilter.sStartMekDoors = transportsPanel.tStartMekDoors.getText();
+ mekFilter.sEndMekDoors = transportsPanel.tEndMekDoors.getText();
+ mekFilter.sStartMekUnits = transportsPanel.tStartMekUnits.getText();
+ mekFilter.sEndMekUnits = transportsPanel.tEndMekUnits.getText();
+
+ mekFilter.sStartHeavyVehicleBays = transportsPanel.tStartHeavyVehicleBays.getText();
+ mekFilter.sEndHeavyVehicleBays = transportsPanel.tEndHeavyVehicleBays.getText();
+ mekFilter.sStartHeavyVehicleDoors = transportsPanel.tStartHeavyVehicleDoors.getText();
+ mekFilter.sEndHeavyVehicleDoors = transportsPanel.tEndHeavyVehicleDoors.getText();
+ mekFilter.sStartHeavyVehicleUnits = transportsPanel.tStartHeavyVehicleUnits.getText();
+ mekFilter.sEndHeavyVehicleUnits = transportsPanel.tEndHeavyVehicleUnits.getText();
+
+ mekFilter.sStartLightVehicleBays = transportsPanel.tStartLightVehicleBays.getText();
+ mekFilter.sEndLightVehicleBays = transportsPanel.tEndLightVehicleBays.getText();
+ mekFilter.sStartLightVehicleDoors = transportsPanel.tStartLightVehicleDoors.getText();
+ mekFilter.sEndLightVehicleDoors = transportsPanel.tEndLightVehicleDoors.getText();
+ mekFilter.sStartLightVehicleUnits = transportsPanel.tStartLightVehicleUnits.getText();
+ mekFilter.sEndLightVehicleUnits = transportsPanel.tEndLightVehicleUnits.getText();
+
+ mekFilter.sStartProtomekBays = transportsPanel.tStartProtomekBays.getText();
+ mekFilter.sEndProtomekBays = transportsPanel.tEndProtomekBays.getText();
+ mekFilter.sStartProtomekDoors = transportsPanel.tStartProtomekDoors.getText();
+ mekFilter.sEndProtomekDoors = transportsPanel.tEndProtomekDoors.getText();
+ mekFilter.sStartProtomekUnits = transportsPanel.tStartProtomekUnits.getText();
+ mekFilter.sEndProtomekUnits = transportsPanel.tEndProtomekUnits.getText();
+
+ mekFilter.sStartBattleArmorBays = transportsPanel.tStartBattleArmorBays.getText();
+ mekFilter.sEndBattleArmorBays = transportsPanel.tEndBattleArmorBays.getText();
+ mekFilter.sStartBattleArmorDoors = transportsPanel.tStartBattleArmorDoors.getText();
+ mekFilter.sEndBattleArmorDoors = transportsPanel.tEndBattleArmorDoors.getText();
+ mekFilter.sStartBattleArmorUnits = transportsPanel.tStartBattleArmorUnits.getText();
+ mekFilter.sEndBattleArmorUnits = transportsPanel.tEndBattleArmorUnits.getText();
+
+ mekFilter.sStartInfantryBays = transportsPanel.tStartInfantryBays.getText();
+ mekFilter.sEndInfantryBays = transportsPanel.tEndInfantryBays.getText();
+ mekFilter.sStartInfantryDoors = transportsPanel.tStartInfantryDoors.getText();
+ mekFilter.sEndInfantryDoors = transportsPanel.tEndInfantryDoors.getText();
+ mekFilter.sStartInfantryUnits = transportsPanel.tStartInfantryUnits.getText();
+ mekFilter.sEndInfantryUnits = transportsPanel.tEndInfantryUnits.getText();
+
+ mekFilter.sStartSuperHeavyVehicleBays = transportsPanel.tStartSuperHeavyVehicleBays.getText();
+ mekFilter.sEndSuperHeavyVehicleBays = transportsPanel.tEndSuperHeavyVehicleBays.getText();
+ mekFilter.sStartSuperHeavyVehicleDoors = transportsPanel.tStartSuperHeavyVehicleDoors.getText();
+ mekFilter.sEndSuperHeavyVehicleDoors = transportsPanel.tEndSuperHeavyVehicleDoors.getText();
+ mekFilter.sStartSuperHeavyVehicleUnits = transportsPanel.tStartSuperHeavyVehicleUnits.getText();
+ mekFilter.sEndSuperHeavyVehicleUnits = transportsPanel.tEndSuperHeavyVehicleUnits.getText();
+
+ mekFilter.sStartDropshuttleBays = transportsPanel.tStartDropshuttleBays.getText();
+ mekFilter.sEndDropshuttleBays = transportsPanel.tEndDropshuttleBays.getText();
+ mekFilter.sStartDropshuttleDoors = transportsPanel.tStartDropshuttleDoors.getText();
+ mekFilter.sEndDropshuttleDoors = transportsPanel.tEndDropshuttleDoors.getText();
+ mekFilter.sStartDropshuttleUnits = transportsPanel.tStartDropshuttleUnits.getText();
+ mekFilter.sEndDropshuttleUnits = transportsPanel.tEndDropshuttleUnits.getText();
+
+ mekFilter.sStartDockingCollars = transportsPanel.tStartDockingCollars.getText();
+ mekFilter.sEndDockingCollars = transportsPanel.tEndDockingCollars.getText();
+
+ mekFilter.sStartBattleArmorHandles = transportsPanel.tStartBattleArmorHandles.getText();
+ mekFilter.sEndBattleArmorHandles = transportsPanel.tEndBattleArmorHandles.getText();
+
+ mekFilter.sStartCargoBayUnits = transportsPanel.tStartCargoBayUnits.getText();
+ mekFilter.sEndCargoBayUnits = transportsPanel.tEndCargoBayUnits.getText();
+
+ mekFilter.sStartNavalRepairFacilities = transportsPanel.tStartNavalRepairFacilities.getText();
+ mekFilter.sEndNavalRepairFacilities = transportsPanel.tEndNavalRepairFacilities.getText();
+ }
+
+ private void updateQuirks() {
+ mekFilter.quirkInclude = quirkPanel.cQuirkInclue.getSelectedIndex();
+ mekFilter.quirkExclude = quirkPanel.cQuirkExclude.getSelectedIndex();
+
+ updateTriStateItemString(mekFilter.quirkType, mekFilter.quirkTypeExclude, quirkPanel.listQuirkType);
+
+ mekFilter.weaponQuirkInclude = quirkPanel.cWeaponQuirkInclue.getSelectedIndex();
+ mekFilter.weaponQuirkExclude = quirkPanel.cWeaponQuirkExclude.getSelectedIndex();
+
+ updateTriStateItemString(mekFilter.weaponQuirkType, mekFilter.weaponQuirkTypeExclude, quirkPanel.listWeaponQuirkType);
+ }
+
+ private void updateUnitTypes() {
+ mekFilter.filterMek = getValue(unitTypePanel.btnFilterMek);
+ mekFilter.filterBipedMek = getValue(unitTypePanel.btnFilterBipedMek);
+ mekFilter.filterProtomek = getValue(unitTypePanel.btnFilterProtoMek);
+ mekFilter.filterLAM = getValue(unitTypePanel.btnFilterLAM);
+ mekFilter.filterTripod = getValue(unitTypePanel.btnFilterTripod);
+ mekFilter.filterQuad = getValue(unitTypePanel.btnFilterQuad);
+ mekFilter.filterQuadVee = getValue(unitTypePanel.btnFilterQuadVee);
+ mekFilter.filterAero = getValue(unitTypePanel.btnFilterAero);
+ mekFilter.filterFixedWingSupport = getValue(unitTypePanel.btnFilterFixedWingSupport);
+ mekFilter.filterConvFighter = getValue(unitTypePanel.btnFilterConvFighter);
+ mekFilter.filterSmallCraft = getValue(unitTypePanel.btnFilterSmallCraft);
+ mekFilter.filterDropship = getValue(unitTypePanel.btnFilterDropship);
+ mekFilter.filterJumpship = getValue(unitTypePanel.btnFilterJumpship);
+ mekFilter.filterWarship = getValue(unitTypePanel.btnFilterWarship);
+ mekFilter.filterSpaceStation = getValue(unitTypePanel.btnFilterSpaceStation);
+ mekFilter.filterInfantry = getValue(unitTypePanel.btnFilterInfantry);
+ mekFilter.filterBattleArmor = getValue(unitTypePanel.btnFilterBattleArmor);
+ mekFilter.filterTank = getValue(unitTypePanel.btnFilterTank);
+ mekFilter.filterVTOL = getValue(unitTypePanel.btnFilterVTOL);
+ mekFilter.filterSupportVTOL = getValue(unitTypePanel.btnFilterSupportVTOL);
+ mekFilter.filterGunEmplacement = getValue(unitTypePanel.btnFilterGunEmplacement);
+ mekFilter.filterSupportTank = getValue(unitTypePanel.btnFilterSupportTank);
+ mekFilter.filterLargeSupportTank = getValue(unitTypePanel.btnFilterLargeSupportTank);
+ mekFilter.filterSuperHeavyTank = getValue(unitTypePanel.btnFilterSuperHeavyTank);
+ mekFilter.iOmni = getValue(unitTypePanel.btnFilterOmni);
+ mekFilter.iMilitary = getValue(unitTypePanel.btnFilterMilitary);
+ mekFilter.iIndustrial = getValue(unitTypePanel.btnFilterIndustrial);
+ mekFilter.iMountedInfantry = getValue(unitTypePanel.btnFilterMountedInfantry);
+ mekFilter.iWaterOnly = getValue(unitTypePanel.btnFilterWaterOnly);
+ mekFilter.iSupportVehicle = getValue(unitTypePanel.btnFilterSupportVehicle);
+ mekFilter.iAerospaceFighter = getValue(unitTypePanel.btnFilterAerospaceFighter);
+ mekFilter.iDoomedOnGround = getValue(unitTypePanel.btnFilterDoomedOnGround);
+ mekFilter.iDoomedInAtmosphere = getValue(unitTypePanel.btnFilterDoomedInAtmosphere);
+ mekFilter.iDoomedInSpace = getValue(unitTypePanel.btnFilterDoomedInSpace);
+ mekFilter.iDoomedInExtremeTemp = getValue(unitTypePanel.btnFilterDoomedInExtremeTemp);
+ mekFilter.iDoomedInVacuum = getValue(unitTypePanel.btnFilterDoomedInVacuum);
+ }
+
+ /**
+ * Update the search fields that aren't automatically updated.
+ */
+ protected void updateMekSearchFilter() {
+ mekFilter.isDisabled = false;
+
+ updateBase();
+ updateTransports();
+ updateQuirks();
+ updateUnitTypes();
+ }
+
+ public int getValue(JButton b) {
+ return switch (b.getText()) {
+ case "\u2610" -> 0;
+ case "\u2611" -> 1;
+ case "\u2612" -> 2;
+ default -> -1;
+ };
+ }
+
+ public int getValue(FlatTriStateCheckBox b) {
+ return switch (b.getState()) {
+ case INDETERMINATE -> 2;
+ case SELECTED -> 1;
+ case UNSELECTED -> 0;
+ };
+ }
+
+ static class StandardScrollPane extends JScrollPane {
+
+ public StandardScrollPane(Component view) {
+ super(view, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
+ getVerticalScrollBar().setUnitIncrement(16);
+ getHorizontalScrollBar().setUnitIncrement(16);
+ setBorder(null);
+ }
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/TransportsSearchTab.java b/megamek/src/megamek/client/ui/advancedsearch/TransportsSearchTab.java
new file mode 100644
index 0000000000..3b64d76aa6
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/TransportsSearchTab.java
@@ -0,0 +1,413 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import megamek.client.ui.Messages;
+
+import javax.swing.*;
+import java.awt.*;
+
+class TransportsSearchTab extends JPanel {
+
+ JButton btnTransportsClear = new JButton(Messages.getString("MekSelectorDialog.ClearTab"));
+ JLabel lblTroopSpace = new JLabel(Messages.getString("MekSelectorDialog.Search.TroopSpace"));
+ JTextField tStartTroopSpace = new JTextField(4);
+ JTextField tEndTroopSpace = new JTextField(4);
+ JLabel lblASFBays = new JLabel(Messages.getString("MekSelectorDialog.Search.ASFBays"));
+ JTextField tStartASFBays = new JTextField(4);
+ JTextField tEndASFBays = new JTextField(4);
+ JLabel lblASFDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
+ JTextField tStartASFDoors = new JTextField(4);
+ JTextField tEndASFDoors = new JTextField(4);
+ JLabel lblASFUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
+ JTextField tStartASFUnits = new JTextField(4);
+ JTextField tEndASFUnits = new JTextField(4);
+ JLabel lblSmallCraftBays = new JLabel(Messages.getString("MekSelectorDialog.Search.SmallCraftBays"));
+ JTextField tStartSmallCraftBays = new JTextField(4);
+ JTextField tEndSmallCraftBays = new JTextField(4);
+ JLabel lblSmallCraftDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
+ JTextField tStartSmallCraftDoors = new JTextField(4);
+ JTextField tEndSmallCraftDoors = new JTextField(4);
+ JLabel lblSmallCraftUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
+ JTextField tStartSmallCraftUnits = new JTextField(4);
+ JTextField tEndSmallCraftUnits = new JTextField(4);
+ JLabel lblMekBays = new JLabel(Messages.getString("MekSelectorDialog.Search.MekBays"));
+ JTextField tStartMekBays = new JTextField(4);
+ JTextField tEndMekBays = new JTextField(4);
+ JLabel lblMekDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
+ JTextField tStartMekDoors = new JTextField(4);
+ JTextField tEndMekDoors = new JTextField(4);
+ JLabel lblMekUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
+ JTextField tStartMekUnits = new JTextField(4);
+ JTextField tEndMekUnits = new JTextField(4);
+ JLabel lblHeavyVehicleBays = new JLabel(Messages.getString("MekSelectorDialog.Search.HeavyVehicleBays"));
+ JTextField tStartHeavyVehicleBays = new JTextField(4);
+ JTextField tEndHeavyVehicleBays = new JTextField(4);
+ JLabel lblHeavyVehicleDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
+ JTextField tStartHeavyVehicleDoors = new JTextField(4);
+ JTextField tEndHeavyVehicleDoors = new JTextField(4);
+ JLabel lblHeavyVehicleUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
+ JTextField tStartHeavyVehicleUnits = new JTextField(4);
+ JTextField tEndHeavyVehicleUnits = new JTextField(4);
+ JLabel lblLightVehicleBays = new JLabel(Messages.getString("MekSelectorDialog.Search.LightVehicleBays"));
+ JTextField tStartLightVehicleBays = new JTextField(4);
+ JTextField tEndLightVehicleBays = new JTextField(4);
+ JLabel lblLightVehicleDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
+ JTextField tStartLightVehicleDoors = new JTextField(4);
+ JTextField tEndLightVehicleDoors = new JTextField(4);
+ JLabel lblLightVehicleUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
+ JTextField tStartLightVehicleUnits = new JTextField(4);
+ JTextField tEndLightVehicleUnits = new JTextField(4);
+ JLabel lblProtomekBays = new JLabel(Messages.getString("MekSelectorDialog.Search.ProtomekBays"));
+ JTextField tStartProtomekBays = new JTextField(4);
+ JTextField tEndProtomekBays = new JTextField(4);
+ JLabel lblProtomekDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
+ JTextField tStartProtomekDoors = new JTextField(4);
+ JTextField tEndProtomekDoors = new JTextField(4);
+ JLabel lblProtomekUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
+ JTextField tStartProtomekUnits = new JTextField(4);
+ JTextField tEndProtomekUnits = new JTextField(4);
+ JLabel lblBattleArmorBays = new JLabel(Messages.getString("MekSelectorDialog.Search.BattleArmorBays"));
+ JTextField tStartBattleArmorBays = new JTextField(4);
+ JTextField tEndBattleArmorBays = new JTextField(4);
+ JLabel lblBattleArmorDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
+ JTextField tStartBattleArmorDoors = new JTextField(4);
+ JTextField tEndBattleArmorDoors = new JTextField(4);
+ JLabel lblBattleArmorUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
+ JTextField tStartBattleArmorUnits = new JTextField(4);
+ JTextField tEndBattleArmorUnits = new JTextField(4);
+ JLabel lblInfantryBays = new JLabel(Messages.getString("MekSelectorDialog.Search.InfantryBays"));
+ JTextField tStartInfantryBays = new JTextField(4);
+ JTextField tEndInfantryBays = new JTextField(4);
+ JLabel lblInfantryDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
+ JTextField tStartInfantryDoors = new JTextField(4);
+ JTextField tEndInfantryDoors = new JTextField(4);
+ JLabel lblInfantryUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
+ JTextField tStartInfantryUnits = new JTextField(4);
+ JTextField tEndInfantryUnits = new JTextField(4);
+ JLabel lblSuperHeavyVehicleBays = new JLabel(Messages.getString("MekSelectorDialog.Search.SuperHeavyVehicleBays"));
+ JTextField tStartSuperHeavyVehicleBays = new JTextField(4);
+ JTextField tEndSuperHeavyVehicleBays = new JTextField(4);
+ JLabel lblSuperHeavyVehicleDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
+ JTextField tStartSuperHeavyVehicleDoors = new JTextField(4);
+ JTextField tEndSuperHeavyVehicleDoors = new JTextField(4);
+ JLabel lblSuperHeavyVehicleUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
+ JTextField tStartSuperHeavyVehicleUnits = new JTextField(4);
+ JTextField tEndSuperHeavyVehicleUnits = new JTextField(4);
+ JLabel lblDropshuttleBays = new JLabel(Messages.getString("MekSelectorDialog.Search.DropshuttleBays"));
+ JTextField tStartDropshuttleBays = new JTextField(4);
+ JTextField tEndDropshuttleBays = new JTextField(4);
+ JLabel lblDropshuttleDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
+ JTextField tStartDropshuttleDoors = new JTextField(4);
+ JTextField tEndDropshuttleDoors = new JTextField(4);
+ JLabel lblDropshuttleUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
+ JTextField tStartDropshuttleUnits = new JTextField(4);
+ JTextField tEndDropshuttleUnits = new JTextField(4);
+ JLabel lblDockingCollars = new JLabel(Messages.getString("MekSelectorDialog.Search.DockingCollars"));
+ JTextField tStartDockingCollars = new JTextField(4);
+ JTextField tEndDockingCollars = new JTextField(4);
+ JLabel lblBattleArmorHandles = new JLabel(Messages.getString("MekSelectorDialog.Search.BattleArmorHandles"));
+ JTextField tStartBattleArmorHandles = new JTextField(4);
+ JTextField tEndBattleArmorHandles = new JTextField(4);
+ JLabel lblCargoBayUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.CargoBayUnits"));
+ JTextField tStartCargoBayUnits = new JTextField(4);
+ JTextField tEndCargoBayUnits = new JTextField(4);
+ JLabel lblNavalRepairFacilities = new JLabel(Messages.getString("MekSelectorDialog.Search.NavalRepairFacilities"));
+ JTextField tStartNavalRepairFacilities = new JTextField(4);
+ JTextField tEndNavalRepairFacilities = new JTextField(4);
+
+ TransportsSearchTab() {
+ btnTransportsClear.addActionListener(e -> clear());
+
+ GridBagConstraints c = new GridBagConstraints();
+ setLayout(new GridBagLayout());
+
+ c.weighty = 0;
+ c.anchor = GridBagConstraints.NORTHWEST;
+ c.fill = GridBagConstraints.NONE;
+ c.insets = new Insets(20, 10, 0, 0);
+
+ c.gridwidth = 1;
+ c.gridx = 0; c.gridy++;
+ JPanel mbPanel = new JPanel();
+ mbPanel.add(lblMekBays);
+ mbPanel.add(tStartMekBays);
+ mbPanel.add(new JLabel("-"));
+ mbPanel.add(tEndMekBays);
+ mbPanel.add(lblMekDoors);
+ mbPanel.add(tStartMekDoors);
+ mbPanel.add(new JLabel("-"));
+ mbPanel.add(tEndMekDoors);
+ mbPanel.add(lblMekUnits);
+ mbPanel.add(tStartMekUnits);
+ mbPanel.add(new JLabel("-"));
+ mbPanel.add(tEndMekUnits);
+ add(mbPanel, c);
+ c.insets = new Insets(5, 10, 0, 0);
+ c.gridx = 0; c.gridy++;
+ JPanel abPanel = new JPanel();
+ abPanel.add(lblASFBays);
+ abPanel.add(tStartASFBays);
+ abPanel.add(new JLabel("-"));
+ abPanel.add(tEndASFBays);
+ abPanel.add(lblASFDoors);
+ abPanel.add(tStartASFDoors);
+ abPanel.add(new JLabel("-"));
+ abPanel.add(tEndASFDoors);
+ abPanel.add(lblASFUnits);
+ abPanel.add(tStartASFUnits);
+ abPanel.add(new JLabel("-"));
+ abPanel.add(tEndASFUnits);
+ add(abPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel scbPanel = new JPanel();
+ scbPanel.add(lblSmallCraftBays);
+ scbPanel.add(tStartSmallCraftBays);
+ scbPanel.add(new JLabel("-"));
+ scbPanel.add(tEndSmallCraftBays);
+ scbPanel.add(lblSmallCraftDoors);
+ scbPanel.add(tStartSmallCraftDoors);
+ scbPanel.add(new JLabel("-"));
+ scbPanel.add(tEndSmallCraftDoors);
+ scbPanel.add(lblSmallCraftUnits);
+ scbPanel.add(tStartSmallCraftUnits);
+ scbPanel.add(new JLabel("-"));
+ scbPanel.add(tEndSmallCraftUnits);
+ add(scbPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel dPanel = new JPanel();
+ dPanel.add(lblDropshuttleBays);
+ dPanel.add(tStartDropshuttleBays);
+ dPanel.add(new JLabel("-"));
+ dPanel.add(tEndDropshuttleBays);
+ dPanel.add(lblDropshuttleDoors);
+ dPanel.add(tStartDropshuttleDoors);
+ dPanel.add(new JLabel("-"));
+ dPanel.add(tEndDropshuttleDoors);
+ dPanel.add(lblDropshuttleUnits);
+ dPanel.add(tStartDropshuttleUnits);
+ dPanel.add(new JLabel("-"));
+ dPanel.add(tEndDropshuttleUnits);
+ add(dPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel lvPanel = new JPanel();
+ lvPanel.add(lblLightVehicleBays);
+ lvPanel.add(tStartLightVehicleBays);
+ lvPanel.add(new JLabel("-"));
+ lvPanel.add(tEndLightVehicleBays);
+ lvPanel.add(lblLightVehicleDoors);
+ lvPanel.add(tStartLightVehicleDoors);
+ lvPanel.add(new JLabel("-"));
+ lvPanel.add(tEndLightVehicleDoors);
+ lvPanel.add(lblLightVehicleUnits);
+ lvPanel.add(tStartLightVehicleUnits);
+ lvPanel.add(new JLabel("-"));
+ lvPanel.add(tEndLightVehicleUnits);
+ add(lvPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel hvPanel = new JPanel();
+ hvPanel.add(lblHeavyVehicleBays);
+ hvPanel.add(tStartHeavyVehicleBays);
+ hvPanel.add(new JLabel("-"));
+ hvPanel.add(tEndHeavyVehicleBays);
+ hvPanel.add(lblHeavyVehicleDoors);
+ hvPanel.add(tStartHeavyVehicleDoors);
+ hvPanel.add(new JLabel("-"));
+ hvPanel.add(tEndHeavyVehicleDoors);
+ hvPanel.add(lblHeavyVehicleUnits);
+ hvPanel.add(tStartHeavyVehicleUnits);
+ hvPanel.add(new JLabel("-"));
+ hvPanel.add(tEndHeavyVehicleUnits);
+ add(hvPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel shvPanel = new JPanel();
+ shvPanel.add(lblSuperHeavyVehicleBays);
+ shvPanel.add(tStartSuperHeavyVehicleBays);
+ shvPanel.add(new JLabel("-"));
+ shvPanel.add(tEndSuperHeavyVehicleBays);
+ shvPanel.add(lblSuperHeavyVehicleDoors);
+ shvPanel.add(tStartSuperHeavyVehicleDoors);
+ shvPanel.add(new JLabel("-"));
+ shvPanel.add(tEndSuperHeavyVehicleDoors);
+ shvPanel.add(lblSuperHeavyVehicleUnits);
+ shvPanel.add(tStartSuperHeavyVehicleUnits);
+ shvPanel.add(new JLabel("-"));
+ shvPanel.add(tEndSuperHeavyVehicleUnits);
+ add(shvPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel pmPanel = new JPanel();
+ pmPanel.add(lblProtomekBays);
+ pmPanel.add(tStartProtomekBays);
+ pmPanel.add(new JLabel("-"));
+ pmPanel.add(tEndProtomekBays);
+ pmPanel.add(lblProtomekDoors);
+ pmPanel.add(tStartProtomekDoors);
+ pmPanel.add(new JLabel("-"));
+ pmPanel.add(tEndProtomekDoors);
+ pmPanel.add(lblProtomekUnits);
+ pmPanel.add(tStartProtomekUnits);
+ pmPanel.add(new JLabel("-"));
+ pmPanel.add(tEndProtomekUnits);
+ add(pmPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel baPanel = new JPanel();
+ baPanel.add(lblBattleArmorBays);
+ baPanel.add(tStartBattleArmorBays);
+ baPanel.add(new JLabel("-"));
+ baPanel.add(tEndBattleArmorBays);
+ baPanel.add(lblBattleArmorDoors);
+ baPanel.add(tStartBattleArmorDoors);
+ baPanel.add(new JLabel("-"));
+ baPanel.add(tEndBattleArmorDoors);
+ baPanel.add(lblBattleArmorUnits);
+ baPanel.add(tStartBattleArmorUnits);
+ baPanel.add(new JLabel("-"));
+ baPanel.add(tEndBattleArmorUnits);
+ add(baPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel iPanel = new JPanel();
+ iPanel.add(lblInfantryBays);
+ iPanel.add(tStartInfantryBays);
+ iPanel.add(new JLabel("-"));
+ iPanel.add(tEndInfantryBays);
+ iPanel.add(lblInfantryDoors);
+ iPanel.add(tStartInfantryDoors);
+ iPanel.add(new JLabel("-"));
+ iPanel.add(tEndInfantryDoors);
+ iPanel.add(lblInfantryUnits);
+ iPanel.add(tStartInfantryUnits);
+ iPanel.add(new JLabel("-"));
+ iPanel.add(tEndInfantryUnits);
+ add(iPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel dcPanel = new JPanel();
+ dcPanel.add(lblDockingCollars);
+ dcPanel.add(tStartDockingCollars);
+ dcPanel.add(new JLabel("-"));
+ dcPanel.add(tEndDockingCollars);
+ add(dcPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel tsPanel = new JPanel();
+ tsPanel.add(lblTroopSpace);
+ tsPanel.add(tStartTroopSpace);
+ tsPanel.add(new JLabel("-"));
+ tsPanel.add(tEndTroopSpace);
+ add(tsPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel cbPanel = new JPanel();
+ cbPanel.add(lblCargoBayUnits);
+ cbPanel.add(tStartCargoBayUnits);
+ cbPanel.add(new JLabel("-"));
+ cbPanel.add(tEndCargoBayUnits);
+ add(cbPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel nrfPanel = new JPanel();
+ nrfPanel.add(lblNavalRepairFacilities);
+ nrfPanel.add(tStartNavalRepairFacilities);
+ nrfPanel.add(new JLabel("-"));
+ nrfPanel.add(tEndNavalRepairFacilities);
+ add(nrfPanel, c);
+ c.gridx = 0; c.gridy++;
+ JPanel bahPanel = new JPanel();
+ bahPanel.add(lblBattleArmorHandles);
+ bahPanel.add(tStartBattleArmorHandles);
+ bahPanel.add(new JLabel("-"));
+ bahPanel.add(tEndBattleArmorHandles);
+ add(bahPanel, c);
+
+ c.weighty = 1;
+ JPanel blankPanel = new JPanel();
+ c.gridx = 0; c.gridy++;
+ blankPanel.add(btnTransportsClear, c);
+ add(blankPanel, c);
+ }
+
+ void clear() {
+ tStartTroopSpace.setText("");
+ tEndTroopSpace.setText("");
+ tStartASFBays.setText("");
+ tEndASFBays.setText("");
+ tStartASFDoors.setText("");
+ tEndASFDoors.setText("");
+ tStartASFUnits.setText("");
+ tEndASFUnits.setText("");
+ tStartSmallCraftBays.setText("");
+ tEndSmallCraftBays.setText("");
+ tStartSmallCraftDoors.setText("");
+ tEndSmallCraftDoors.setText("");
+ tStartSmallCraftUnits.setText("");
+ tEndSmallCraftUnits.setText("");
+ tStartMekBays.setText("");
+ tEndMekBays.setText("");
+ tStartMekDoors.setText("");
+ tEndMekDoors.setText("");
+ tStartMekUnits.setText("");
+ tEndMekUnits.setText("");
+ tStartHeavyVehicleBays.setText("");
+ tEndHeavyVehicleBays.setText("");
+ tStartHeavyVehicleDoors.setText("");
+ tEndHeavyVehicleDoors.setText("");
+ tStartHeavyVehicleUnits.setText("");
+ tEndHeavyVehicleUnits.setText("");
+ tStartLightVehicleBays.setText("");
+ tEndLightVehicleBays.setText("");
+ tStartLightVehicleDoors.setText("");
+ tEndLightVehicleDoors.setText("");
+ tStartLightVehicleUnits.setText("");
+ tEndLightVehicleUnits.setText("");
+ tStartProtomekBays.setText("");
+ tEndProtomekBays.setText("");
+ tStartProtomekDoors.setText("");
+ tEndProtomekDoors.setText("");
+ tStartProtomekUnits.setText("");
+ tEndProtomekUnits.setText("");
+ tStartBattleArmorBays.setText("");
+ tEndBattleArmorBays.setText("");
+ tStartBattleArmorDoors.setText("");
+ tEndBattleArmorDoors.setText("");
+ tStartBattleArmorUnits.setText("");
+ tEndBattleArmorUnits.setText("");
+ tStartInfantryBays.setText("");
+ tEndInfantryBays.setText("");
+ tStartInfantryDoors.setText("");
+ tEndInfantryDoors.setText("");
+ tStartInfantryUnits.setText("");
+ tEndInfantryUnits.setText("");
+ tStartSuperHeavyVehicleBays.setText("");
+ tEndSuperHeavyVehicleBays.setText("");
+ tStartSuperHeavyVehicleDoors.setText("");
+ tEndSuperHeavyVehicleDoors.setText("");
+ tStartSuperHeavyVehicleUnits.setText("");
+ tEndSuperHeavyVehicleUnits.setText("");
+ tStartDropshuttleBays.setText("");
+ tEndDropshuttleBays.setText("");
+ tStartDropshuttleDoors.setText("");
+ tEndDropshuttleDoors.setText("");
+ tStartDropshuttleUnits.setText("");
+ tEndDropshuttleUnits.setText("");
+ tStartDockingCollars.setText("");
+ tEndDockingCollars.setText("");
+ tStartBattleArmorHandles.setText("");
+ tEndBattleArmorHandles.setText("");
+ tStartCargoBayUnits.setText("");
+ tEndCargoBayUnits.setText("");
+ tStartNavalRepairFacilities.setText("");
+ tEndNavalRepairFacilities.setText("");
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/TriStateItem.java b/megamek/src/megamek/client/ui/advancedsearch/TriStateItem.java
new file mode 100644
index 0000000000..25822179a2
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/TriStateItem.java
@@ -0,0 +1,23 @@
+package megamek.client.ui.advancedsearch;
+
+class TriStateItem {
+ public String state;
+ public String text;
+ public int code;
+
+ public TriStateItem(String state, String text) {
+ this.state = state;
+ this.text = text;
+ }
+
+ public TriStateItem(String state, int code, String text) {
+ this.state = state;
+ this.code = code;
+ this.text = text;
+ }
+
+ @Override
+ public String toString() {
+ return state + " " + text;
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/UnitTypeSearchTab.java b/megamek/src/megamek/client/ui/advancedsearch/UnitTypeSearchTab.java
new file mode 100644
index 0000000000..d423212340
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/UnitTypeSearchTab.java
@@ -0,0 +1,232 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import com.formdev.flatlaf.extras.components.FlatTriStateCheckBox;
+import megamek.client.ui.Messages;
+
+import java.util.List;
+import javax.swing.*;
+import java.awt.*;
+
+/**
+ * This class is the unit type search panel of the (TW) advanced search, offering selection of e.g. Quad, Tripod, Doomed in Vacuum
+ * and other filters beyond the standard unit types.
+ */
+public class UnitTypeSearchTab extends JPanel {
+
+ final JButton clearButton = new JButton(Messages.getString("MekSelectorDialog.ClearTab"));
+
+ final FlatTriStateCheckBox btnFilterProtoMek = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.ProtoMek"));
+ final FlatTriStateCheckBox btnFilterMek = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Mek"));
+ final FlatTriStateCheckBox btnFilterBipedMek = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.BipedMek"));
+ final FlatTriStateCheckBox btnFilterLAM = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.LAM"));
+ final FlatTriStateCheckBox btnFilterTripod = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Tripod"));
+ final FlatTriStateCheckBox btnFilterQuad = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Quad"));
+ final FlatTriStateCheckBox btnFilterQuadVee = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.QuadVee"));
+ final FlatTriStateCheckBox btnFilterAero = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Aero"));
+ final FlatTriStateCheckBox btnFilterAerospaceFighter = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.AerospaceFighter"));
+ final FlatTriStateCheckBox btnFilterFixedWingSupport = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.FixedWingSupport"));
+ final FlatTriStateCheckBox btnFilterConvFighter = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.ConvFighter"));
+ final FlatTriStateCheckBox btnFilterSmallCraft = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.SmallCraft"));
+ final FlatTriStateCheckBox btnFilterDropship = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Dropship"));
+ final FlatTriStateCheckBox btnFilterJumpship = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Jumpship"));
+ final FlatTriStateCheckBox btnFilterWarship = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Warship"));
+ final FlatTriStateCheckBox btnFilterSpaceStation = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.SpaceStation"));
+ final FlatTriStateCheckBox btnFilterInfantry = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Infantry"));
+ final FlatTriStateCheckBox btnFilterBattleArmor = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.BattleArmor"));
+ final FlatTriStateCheckBox btnFilterTank = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Tank"));
+ final FlatTriStateCheckBox btnFilterVTOL = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.VTOL"));
+ final FlatTriStateCheckBox btnFilterSupportVTOL = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.SupportVTOL"));
+ final FlatTriStateCheckBox btnFilterGunEmplacement = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.GunEmplacement"));
+ final FlatTriStateCheckBox btnFilterSupportTank = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.SupportTank"));
+ final FlatTriStateCheckBox btnFilterLargeSupportTank = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.LargeSupportTank"));
+ final FlatTriStateCheckBox btnFilterSuperHeavyTank = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.SuperHeavyTank"));
+ final FlatTriStateCheckBox btnFilterOmni = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Omni"));
+ final FlatTriStateCheckBox btnFilterMilitary = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Military"));
+ final FlatTriStateCheckBox btnFilterIndustrial = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.Industrial"));
+ final FlatTriStateCheckBox btnFilterMountedInfantry = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.MountedInfantry"));
+ final FlatTriStateCheckBox btnFilterWaterOnly = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.WaterOnly"));
+ final FlatTriStateCheckBox btnFilterSupportVehicle = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.SupportVehicle"));
+ final FlatTriStateCheckBox btnFilterDoomedOnGround = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.DoomedOnGround"));
+ final FlatTriStateCheckBox btnFilterDoomedInAtmosphere = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.DoomedInAtmosphere"));
+ final FlatTriStateCheckBox btnFilterDoomedInSpace = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.DoomedInSpace"));
+ final FlatTriStateCheckBox btnFilterDoomedInExtremeTemp = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.DoomedInExtremeTemp"));
+ final FlatTriStateCheckBox btnFilterDoomedInVacuum = new SearchTriStateCheckBox(Messages.getString("MekSelectorDialog.Search.DoomedInVacuum"));
+
+ final List checkBoxes = List.of(btnFilterProtoMek, btnFilterMek, btnFilterBipedMek, btnFilterLAM, btnFilterTripod,
+ btnFilterQuad, btnFilterQuadVee, btnFilterAero, btnFilterFixedWingSupport, btnFilterConvFighter, btnFilterSmallCraft,
+ btnFilterDropship, btnFilterJumpship, btnFilterWarship, btnFilterSpaceStation, btnFilterInfantry, btnFilterAerospaceFighter,
+ btnFilterBattleArmor, btnFilterBattleArmor, btnFilterTank, btnFilterVTOL, btnFilterGunEmplacement, btnFilterSupportTank,
+ btnFilterLargeSupportTank, btnFilterSuperHeavyTank, btnFilterOmni, btnFilterMilitary, btnFilterIndustrial,
+ btnFilterMountedInfantry, btnFilterWaterOnly, btnFilterSupportVehicle, btnFilterDoomedOnGround, btnFilterDoomedInAtmosphere,
+ btnFilterDoomedInSpace, btnFilterDoomedInExtremeTemp, btnFilterDoomedInVacuum);
+
+ UnitTypeSearchTab() {
+ clearButton.addActionListener(e -> clear());
+
+ setLayout(new GridBagLayout());
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ gbc.weighty = 0;
+ gbc.anchor = GridBagConstraints.NORTHWEST;
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.gridy = 0;
+ gbc.gridwidth = 4;
+ add(Box.createVerticalStrut(20));
+
+ gbc.gridwidth = 1;
+ gbc.gridy++;
+ add(btnFilterProtoMek, gbc);
+
+ gbc.gridy++;
+ add(Box.createVerticalStrut(10), gbc);
+
+ gbc.gridy++;
+ add(btnFilterMek, gbc);
+ add(btnFilterBipedMek, gbc);
+ add(btnFilterLAM, gbc);
+
+ gbc.gridy++;
+ gbc.gridx = 1;
+ add(btnFilterTripod, gbc);
+
+ gbc.gridy++;
+ add(btnFilterQuad, gbc);
+ gbc.gridx = 2;
+ add(btnFilterQuadVee, gbc);
+
+ gbc.gridy++;
+ add(Box.createVerticalStrut(10), gbc);
+
+ gbc.gridx = -1;
+ gbc.gridy++;
+ add(btnFilterAero, gbc);
+ add(btnFilterAerospaceFighter, gbc);
+ add(btnFilterConvFighter, gbc);
+ add(btnFilterFixedWingSupport, gbc);
+
+ gbc.gridy++;
+ gbc.gridx = 1;
+ add(btnFilterSmallCraft, gbc);
+ gbc.gridx = 2;
+ add(btnFilterDropship, gbc);
+
+ gbc.gridy++;
+ gbc.gridx = 1;
+ add(btnFilterJumpship, gbc);
+ gbc.gridx = 2;
+ add(btnFilterWarship, gbc);
+
+ gbc.gridy++;
+ gbc.gridx = 2;
+ add(btnFilterSpaceStation, gbc);
+
+ gbc.gridy++;
+ add(Box.createVerticalStrut(10), gbc);
+
+ gbc.gridx = -1;
+ gbc.gridy++;
+ add(btnFilterInfantry, gbc);
+ add(btnFilterBattleArmor, gbc);
+
+ gbc.gridy++;
+ add(Box.createVerticalStrut(10), gbc);
+
+ gbc.gridx = -1;
+ gbc.gridy++;
+ add(btnFilterTank, gbc);
+ add(btnFilterVTOL, gbc);
+ add(btnFilterSupportVTOL, gbc);
+
+ gbc.gridy++;
+ gbc.gridx = 1;
+ add(btnFilterGunEmplacement, gbc);
+
+ gbc.gridy++;
+ add(btnFilterSupportTank, gbc);
+ gbc.gridx = 2;
+ add(btnFilterLargeSupportTank, gbc);
+
+ gbc.gridy++;
+ gbc.gridx = 1;
+ add(btnFilterSuperHeavyTank, gbc);
+
+ gbc.gridy++;
+ add(Box.createVerticalStrut(10), gbc);
+
+ gbc.gridy++;
+ gbc.gridx = 0;
+ gbc.fill = GridBagConstraints.BOTH;
+ gbc.gridwidth = 4;
+ JPanel dotSep = new JPanel();
+ dotSep.setLayout(new BoxLayout(dotSep, BoxLayout.PAGE_AXIS));
+ dotSep.add(new ASAdvancedSearchPanel.DottedSeparator());
+ add(dotSep, gbc);
+
+ gbc.gridy++;
+ add(Box.createVerticalStrut(10), gbc);
+
+ gbc.gridx = -1;
+ gbc.gridy++;
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.gridwidth = 5;
+ JPanel filter1Panel = new JPanel();
+ filter1Panel.add(btnFilterOmni);
+ filter1Panel.add(btnFilterMilitary);
+ filter1Panel.add(btnFilterIndustrial);
+ filter1Panel.add(btnFilterMountedInfantry);
+ filter1Panel.add(btnFilterSupportVehicle);
+ add(filter1Panel, gbc);
+
+ gbc.gridy++;
+ JPanel filter2Panel = new JPanel();
+ filter2Panel.add(btnFilterWaterOnly);
+ filter2Panel.add(btnFilterDoomedInExtremeTemp);
+ filter2Panel.add(btnFilterDoomedInVacuum);
+ add(filter2Panel, gbc);
+
+ gbc.gridy++;
+ JPanel filter3Panel = new JPanel();
+ filter3Panel.add(btnFilterDoomedOnGround);
+ filter3Panel.add(btnFilterDoomedInAtmosphere);
+ filter3Panel.add(btnFilterDoomedInSpace);
+ add(filter3Panel, gbc);
+
+ gbc.gridy++;
+ gbc.weighty = 1;
+ JPanel blankPanel = new JPanel();
+ blankPanel.add(clearButton);
+ add(blankPanel, gbc);
+ }
+
+ void clear() {
+ checkBoxes.forEach(checkBox -> checkBox.setSelected(false));
+ }
+
+ /**
+ * Adapts FlatLaf's tri state checkbox to start as empty and go from there to checked and then "-" = UNDETERMINATE
+ */
+ static class SearchTriStateCheckBox extends FlatTriStateCheckBox {
+ public SearchTriStateCheckBox(String text) {
+ super(text, State.UNSELECTED);
+ setAltStateCycleOrder(true);
+ }
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/WeaponClass.java b/megamek/src/megamek/client/ui/advancedsearch/WeaponClass.java
new file mode 100644
index 0000000000..37fe092897
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/WeaponClass.java
@@ -0,0 +1,192 @@
+
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+public enum WeaponClass {
+ AUTOCANNON {
+ public String toString() {
+ return "Autocannon";
+ }
+ },
+ RAC,
+ ULTRA {
+ public String toString() {
+ return "Ultra A/C";
+ }
+ },
+ LIGHT {
+ public String toString() {
+ return "Light A/C";
+ }
+ },
+ MACHINE_GUN {
+ public String toString() {
+ return "Machine Gun";
+ }
+ },
+ GAUSS {
+ public String toString() {
+ return "Gauss";
+ }
+ },
+ BALLISTIC {
+ public String toString() {
+ return "Ballistic";
+ }
+ },
+ PLASMA {
+ public String toString() {
+ return "Plasma";
+ }
+ },
+ ENERGY {
+ public String toString() {
+ return "Energy";
+ }
+ },
+ LASER {
+ public String toString() {
+ return "Laser";
+ }
+ },
+ PULSE {
+ public String toString() {
+ return "Pulse Laser";
+ }
+ },
+ RE_ENGINEERED {
+ public String toString() {
+ return "Re-Engineered Laser";
+ }
+ },
+ PPC {
+ public String toString() {
+ return "PPC";
+ }
+ },
+ TASER {
+ public String toString() {
+ return "Taser";
+ }
+ },
+ FLAMER {
+ public String toString() {
+ return "Flamer";
+ }
+ },
+ MISSILE {
+ public String toString() {
+ return "Missile";
+ }
+ },
+ LRM,
+ MRM,
+ SRM,
+ PHYSICAL {
+ public String toString() {
+ return "Physical (inc. industrial equipment)";
+ }
+ },
+ AMS,
+ PRACTICAL_PHYSICAL {
+ public String toString() {
+ return "Physical (weapons only)";
+ }
+ };
+
+ public boolean matches(String name) {
+ if (name.toLowerCase().contains("ammo")) {
+ return false;
+ }
+ if (this == PHYSICAL) {
+ String lName = name.toLowerCase();
+
+ if (lName.contains("backhoe") ||
+ lName.contains("saw") ||
+ lName.contains("whip") ||
+ lName.contains("claw") ||
+ lName.contains("combine") ||
+ lName.contains("flail") ||
+ lName.contains("hatchet") ||
+ lName.contains("driver") ||
+ lName.contains("lance") ||
+ lName.contains("mace") ||
+ lName.contains("drill") ||
+ lName.contains("ram") ||
+ lName.contains("blade") ||
+ lName.contains("cutter") ||
+ lName.contains("shield") ||
+ lName.contains("welder") ||
+ lName.contains("sword") ||
+ lName.contains("talons") ||
+ lName.contains("wrecking")) {
+ return true;
+ }
+ } else if (this == PRACTICAL_PHYSICAL) {
+ String lName = name.toLowerCase();
+
+ if (lName.contains("claw") ||
+ lName.contains("flail") ||
+ lName.contains("hatchet") ||
+ lName.contains("lance") ||
+ lName.contains("mace") ||
+ lName.contains("blade") ||
+ lName.contains("shield") ||
+ lName.contains("sword") ||
+ lName.contains("talons")) {
+ return true;
+ }
+ } else if (this == MISSILE) {
+ if ((name.toLowerCase().contains("lrm") ||
+ name.toLowerCase().contains("mrm") ||
+ name.toLowerCase().contains("srm")) &&
+ !name.toLowerCase().contains("ammo")) {
+ return true;
+ }
+ } else if (this == RE_ENGINEERED) {
+ if (name.toLowerCase().contains("engineered")) {
+ return true;
+ }
+ } else if (this == ENERGY) {
+ if (WeaponClass.LASER.matches(name) || WeaponClass.PPC.matches(name) || WeaponClass.FLAMER.matches(name)) {
+ return true;
+ }
+ } else if (this == MACHINE_GUN) {
+ if ((name.toLowerCase().contains("mg") || name.toLowerCase().contains("machine")) && !name.toLowerCase().contains("ammo")) {
+ return true;
+ }
+ } else if (this == BALLISTIC) {
+ return WeaponClass.AUTOCANNON.matches(name) ||
+ WeaponClass.GAUSS.matches(name) ||
+ WeaponClass.MACHINE_GUN.matches(name);
+ } else if (this == RAC) {
+ if (name.toLowerCase().contains("rotary")) {
+ return true;
+ }
+ } else if (this == ULTRA) {
+ if (name.toLowerCase().contains("ultraa")) {
+ return true;
+ }
+ } else if (name.toLowerCase().contains(this.name().toLowerCase()) && !name.toLowerCase().contains("ammo")) {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/WeaponClassFT.java b/megamek/src/megamek/client/ui/advancedsearch/WeaponClassFT.java
new file mode 100644
index 0000000000..5eaa09152a
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/WeaponClassFT.java
@@ -0,0 +1,20 @@
+package megamek.client.ui.advancedsearch;
+
+public class WeaponClassFT extends EquipmentFilterToken {
+ public WeaponClass weaponClass;
+ public int qty;
+
+ public WeaponClassFT(WeaponClass in_class, int in_qty) {
+ weaponClass = in_class;
+ qty = in_qty;
+ }
+
+ @Override
+ public String toString() {
+ if (qty == 1) {
+ return qty + " " + weaponClass.toString();
+ } else {
+ return qty + " " + weaponClass.toString() + "s";
+ }
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/WeaponClassTableModel.java b/megamek/src/megamek/client/ui/advancedsearch/WeaponClassTableModel.java
new file mode 100644
index 0000000000..f2ab5f26f1
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/WeaponClassTableModel.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import javax.swing.table.AbstractTableModel;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Vector;
+
+public class WeaponClassTableModel extends AbstractTableModel {
+
+ static final int COL_QTY = 0;
+ static final int COL_NAME = 1;
+ static final int N_COL = 2;
+ static final int COL_VAL = 2;
+
+
+ private final int[] qty;
+
+ private final Vector weaponClasses = new Vector<>();
+
+ public WeaponClassTableModel() {
+ Collections.addAll(weaponClasses, WeaponClass.values());
+ qty = new int[weaponClasses.size()];
+ Arrays.fill(qty, 1);
+ }
+
+ @Override
+ public int getRowCount() {
+ return weaponClasses.size();
+ }
+
+ @Override
+ public int getColumnCount() {
+ return N_COL;
+ }
+
+ public int getPreferredWidth(int col) {
+ return switch (col) {
+ case COL_QTY -> 40;
+ case COL_NAME -> 310;
+ default -> 0;
+ };
+ }
+
+ @Override
+ public String getColumnName(int column) {
+ return switch (column) {
+ case COL_QTY -> "Qty";
+ case COL_NAME -> "Weapon Class";
+ default -> "?";
+ };
+ }
+
+ @Override
+ public Class> getColumnClass(int c) {
+ return getValueAt(0, c).getClass();
+ }
+
+ @Override
+ public boolean isCellEditable(int row, int col) {
+ return col == COL_QTY;
+ }
+
+ @Override
+ public Object getValueAt(int row, int col) {
+ if (row >= weaponClasses.size()) {
+ return null;
+ }
+
+ return switch (col) {
+ case COL_QTY -> qty[row] + "";
+ case COL_NAME -> weaponClasses.elementAt(row).toString();
+ case COL_VAL -> weaponClasses.elementAt(row);
+ default -> "?";
+ };
+ }
+
+ @Override
+ public void setValueAt(Object value, int row, int col) {
+ if (col == COL_QTY) {
+ qty[row] = Integer.parseInt((String) value);
+ fireTableCellUpdated(row, col);
+ }
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/WeaponSearchTab.java b/megamek/src/megamek/client/ui/advancedsearch/WeaponSearchTab.java
new file mode 100644
index 0000000000..f9cf4324db
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/WeaponSearchTab.java
@@ -0,0 +1,613 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * listener file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import megamek.client.ui.Messages;
+import megamek.client.ui.swing.table.MegaMekTable;
+import megamek.common.*;
+import megamek.common.annotations.Nullable;
+
+import javax.swing.*;
+import javax.swing.border.EmptyBorder;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.table.TableColumn;
+import javax.swing.table.TableRowSorter;
+import java.awt.*;
+import java.awt.event.FocusEvent;
+import java.awt.event.FocusListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.util.*;
+import java.util.List;
+import java.util.regex.PatternSyntaxException;
+
+public class WeaponSearchTab extends JPanel implements KeyListener, DocumentListener, FocusListener {
+
+ final List filterTokens = new ArrayList<>();
+
+ final JButton btnLeftParen = new JButton("(");
+ final JButton btnRightParen = new JButton(")");
+ final JButton btnAdd = new JButton(Messages.getString("MekSelectorDialog.Search.add"));
+ final JButton btnAnd = new JButton(Messages.getString("MekSelectorDialog.Search.and"));
+ final JButton btnOr = new JButton(Messages.getString("MekSelectorDialog.Search.or"));
+ final JButton btnClear = new JButton(Messages.getString("MekSelectorDialog.Reset"));
+ final JButton btnBack = new JButton("Back");
+ final JLabel lblWEEqExpTxt = new JLabel(Messages.getString("MekSelectorDialog.Search.FilterExpression"));
+ final JTextArea txtWEEqExp = new JTextArea("", 2, 40);
+ final JScrollPane expWEScroller = new JScrollPane(txtWEEqExp,
+ JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
+ JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+
+ final JLabel lblTableFilters = new JLabel(Messages.getString("MekSelectorDialog.Search.TableFilters"));
+ final JLabel lblUnitType = new JLabel(Messages.getString("MekSelectorDialog.Search.UnitType"));
+ final JLabel lblTechClass = new JLabel(Messages.getString("MekSelectorDialog.Search.TechClass"));
+ final JLabel lblTechLevelBase = new JLabel(Messages.getString("MekSelectorDialog.Search.TechLevel"));
+ final JComboBox cboUnitType = new JComboBox<>();
+ final JComboBox cboTechClass = new JComboBox<>();
+ final JComboBox cboTechLevel = new JComboBox<>();
+ final JLabel tableFilterTextLabel = new JLabel(Messages.getString("MekSelectorDialog.Search.TableFilter"));
+ final JTextField tableFilterText = new JTextField(20);
+
+ final JLabel lblWeapons = new JLabel(Messages.getString("MekSelectorDialog.Search.Weapons"));
+ final JScrollPane scrTableWeapons = new JScrollPane();
+ final MegaMekTable tblWeapons;
+ final WeaponsTableModel weaponsModel;
+ final TableRowSorter weaponsSorter;
+ final JLabel lblEquipment = new JLabel(Messages.getString("MekSelectorDialog.Search.Equipment"));
+ final JScrollPane scrTableEquipment = new JScrollPane();
+ final MegaMekTable tblEquipment;
+ final EquipmentTableModel equipmentModel;
+ final TableRowSorter equipmentSorter;
+ final JComboBox cboQty = new JComboBox<>();
+
+ final JLabel lblWeaponClass = new JLabel(Messages.getString("MekSelectorDialog.Search.WeaponClass"));
+ final JSpinner weaponClassCount;
+ final JComboBox weaponClassChooser;
+
+ JComponent focusedSelector = null;
+
+ private final TWAdvancedSearchPanel parentPanel;
+
+ WeaponSearchTab(TWAdvancedSearchPanel parentPanel) {
+ this.parentPanel = parentPanel;
+
+ btnAnd.addActionListener(e -> addFilterToken(new AndFilterToken()));
+ btnAdd.addActionListener(e -> addButtonPressed());
+ btnLeftParen.addActionListener(e -> addFilterToken(new LeftParensFilterToken()));
+ btnRightParen.addActionListener(e -> addFilterToken(new RightParensFilterToken()));
+ btnOr.addActionListener(e -> addFilterToken(new OrFilterToken()));
+ btnClear.addActionListener(e -> clear());
+ btnBack.addActionListener(e -> backOperation());
+ adaptTokenButtons();
+
+ for (int i = 1; i <= 20; i++) {
+ cboQty.addItem(Integer.toString(i));
+ }
+ cboQty.setSelectedIndex(0);
+
+ // Setup table filter combo boxes
+ DefaultComboBoxModel unitTypeModel = new DefaultComboBoxModel<>();
+ unitTypeModel.addElement(Messages.getString("MekSelectorDialog.All"));
+ unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.MEK));
+ unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.TANK));
+ unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.BATTLE_ARMOR));
+ unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.INFANTRY));
+ unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.PROTOMEK));
+ unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.AERO));
+ unitTypeModel.setSelectedItem(Messages.getString("MekSelectorDialog.All"));
+
+ cboUnitType.setModel(unitTypeModel);
+ cboUnitType.addActionListener(e -> filterTables());
+
+ DefaultComboBoxModel techLevelModel = new DefaultComboBoxModel<>();
+
+ for (int i = 0; i < TechConstants.SIZE; i++) {
+ techLevelModel.addElement(TechConstants.getLevelDisplayableName(i));
+ }
+
+ techLevelModel.setSelectedItem(TechConstants.getLevelDisplayableName(TechConstants.SIZE - 1));
+ cboTechLevel.setModel(techLevelModel);
+ cboTechLevel.addActionListener(e -> filterTables());
+
+ DefaultComboBoxModel techClassModel = new DefaultComboBoxModel<>();
+ techClassModel.addElement("All");
+ techClassModel.addElement("Inner Sphere");
+ techClassModel.addElement("Clan");
+ techClassModel.addElement("IS/Clan");
+ techClassModel.addElement("(Unknown Technology Base)");
+ techClassModel.setSelectedItem("All");
+ cboTechClass.setModel(techClassModel);
+ cboTechClass.addActionListener(e -> filterTables());
+
+ // Set up Weapon Class chooser
+ weaponClassCount = new JSpinner(new SpinnerNumberModel(1, 1, 20, 1));
+ weaponClassCount.addChangeListener(e->spinnerChange());
+ weaponClassChooser = new JComboBox<>(WeaponClass.values());
+ weaponClassChooser.addFocusListener(this);
+
+ // Setup Weapons Table
+ weaponsModel = new WeaponsTableModel(parentPanel);
+ tblWeapons = new MegaMekTable(weaponsModel, WeaponsTableModel.COL_NAME) {
+ @Override
+ public Dimension getPreferredScrollableViewportSize() {
+ Dimension standardSize = super.getPreferredScrollableViewportSize();
+ return new Dimension(standardSize.width, getRowHeight() * 6);
+ }
+ };
+ TableColumn wpsCol = tblWeapons.getColumnModel().getColumn(WeaponsTableModel.COL_QTY);
+ wpsCol.setCellEditor(new DefaultCellEditor(cboQty));
+ tblWeapons.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ weaponsSorter = new TableRowSorter<>(weaponsModel);
+ tblWeapons.setRowSorter(weaponsSorter);
+ tblWeapons.addKeyListener(this);
+ tblWeapons.addFocusListener(this);
+
+ for (int i = 0; i < weaponsModel.getColumnCount(); i++) {
+ tblWeapons.getColumnModel().getColumn(i).setPreferredWidth(weaponsModel.getPreferredWidth(i));
+ }
+
+ scrTableWeapons.setViewportView(tblWeapons);
+
+ // Setup Equipment Table
+ equipmentModel = new EquipmentTableModel(parentPanel);
+ tblEquipment = new MegaMekTable(equipmentModel, EquipmentTableModel.COL_NAME) {
+ @Override
+ public Dimension getPreferredScrollableViewportSize() {
+ Dimension standardSize = super.getPreferredScrollableViewportSize();
+ return new Dimension(standardSize.width, getRowHeight() * 6);
+ }
+ };
+ TableColumn eqCol = tblEquipment.getColumnModel().getColumn(EquipmentTableModel.COL_QTY);
+ eqCol.setCellEditor(new DefaultCellEditor(cboQty));
+ tblEquipment.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ equipmentSorter = new TableRowSorter<>(equipmentModel);
+ tblEquipment.setRowSorter(equipmentSorter);
+ tblEquipment.addKeyListener(this);
+ tblEquipment.addFocusListener(this);
+
+ for (int i = 0; i < equipmentModel.getColumnCount(); i++) {
+ tblEquipment.getColumnModel().getColumn(i).setPreferredWidth(equipmentModel.getPreferredWidth(i));
+ }
+
+ scrTableEquipment.setViewportView(tblEquipment);
+
+ // Populate Tables
+ populateWeaponsAndEquipmentChoices();
+
+ // initialize with the weapons sorted alphabetically by name
+ ArrayList sortlist = new ArrayList<>();
+ sortlist.add(new RowSorter.SortKey(WeaponsTableModel.COL_NAME, SortOrder.ASCENDING));
+ tblWeapons.getRowSorter().setSortKeys(sortlist);
+ ((DefaultRowSorter, ?>) tblWeapons.getRowSorter()).sort();
+ tblWeapons.invalidate(); // force re-layout of window
+
+ // initialize with the equipment sorted alphabetically by chassis
+ sortlist = new ArrayList<>();
+ sortlist.add(new RowSorter.SortKey(EquipmentTableModel.COL_NAME, SortOrder.ASCENDING));
+ tblEquipment.getRowSorter().setSortKeys(sortlist);
+ ((DefaultRowSorter, ?>) tblEquipment.getRowSorter()).sort();
+ tblEquipment.invalidate(); // force re-layout of window
+
+ txtWEEqExp.setEditable(false);
+ txtWEEqExp.setLineWrap(true);
+ txtWEEqExp.setWrapStyleWord(true);
+
+ tableFilterText.getDocument().addDocumentListener(this);
+
+ JPanel upperPanel = new JPanel();
+ upperPanel.setLayout(new GridBagLayout());
+ GridBagConstraints gbc = new GridBagConstraints();
+
+ gbc.weighty = 0;
+ gbc.anchor = GridBagConstraints.NORTHWEST;
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.insets = new Insets(0, 0, 0, 0);
+ gbc.gridy = 0;
+ upperPanel.add(lblTableFilters, gbc);
+ gbc.gridy++;
+ gbc.gridwidth = 4;
+ gbc.anchor = GridBagConstraints.CENTER;
+ JPanel tableTechFilterPanel = new JPanel();
+ tableTechFilterPanel.add(lblUnitType);
+ tableTechFilterPanel.add(cboUnitType);
+ tableTechFilterPanel.add(lblTechClass);
+ tableTechFilterPanel.add(cboTechClass);
+ tableTechFilterPanel.add(lblTechLevelBase);
+ tableTechFilterPanel.add(cboTechLevel);
+ upperPanel.add(tableTechFilterPanel, gbc);
+
+ gbc.gridy++;
+ JPanel tableTextFilterPanel = new JPanel();
+ tableTextFilterPanel.add(tableFilterTextLabel);
+ tableTextFilterPanel.add(tableFilterText);
+ upperPanel.add(tableTextFilterPanel, gbc);
+
+ gbc.gridwidth = 1;
+ gbc.insets = new Insets(0, 0, 0, 0);
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.gridy++;
+ gbc.anchor = GridBagConstraints.WEST;
+ upperPanel.add(lblWeapons, gbc);
+
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ gbc.anchor = GridBagConstraints.CENTER;
+ gbc.gridwidth = 5;
+ gbc.gridy++;
+ upperPanel.add(scrTableWeapons, gbc);
+
+ gbc.gridy++;
+ upperPanel.add(Box.createVerticalStrut(20), gbc);
+
+ gbc.fill = GridBagConstraints.NONE;
+ gbc.gridwidth = 1;
+ gbc.gridy++;
+ gbc.anchor = GridBagConstraints.WEST;
+ upperPanel.add(lblEquipment, gbc);
+
+ gbc.fill = GridBagConstraints.HORIZONTAL;
+ gbc.anchor = GridBagConstraints.CENTER;
+ gbc.gridwidth = 5;
+ gbc.gridy++;
+ upperPanel.add(scrTableEquipment, gbc);
+
+ gbc.gridy++;
+ upperPanel.add(Box.createVerticalStrut(20), gbc);
+
+ gbc.gridwidth = 1;
+ gbc.gridy++;
+ gbc.anchor = GridBagConstraints.WEST;
+ gbc.insets = new Insets(0, 0, 0, 20);
+ upperPanel.add(lblWeaponClass, gbc);
+ gbc.gridy++;
+ upperPanel.add(weaponClassCount, gbc);
+ upperPanel.add(weaponClassChooser, gbc);
+
+ JPanel btnPanel = new JPanel();
+ btnPanel.add(btnAdd);
+ btnPanel.add(btnLeftParen);
+ btnPanel.add(btnRightParen);
+ btnPanel.add(btnAnd);
+ btnPanel.add(btnOr);
+ btnPanel.add(btnBack);
+ btnPanel.add(btnClear);
+
+ Box filterExpressionPanel = Box.createHorizontalBox();
+ filterExpressionPanel.setBorder(new EmptyBorder(0, 20, 0, 20));
+ filterExpressionPanel.add(lblWEEqExpTxt);
+ filterExpressionPanel.add(Box.createHorizontalStrut(20));
+ filterExpressionPanel.add(expWEScroller);
+
+ Box filterAssemblyPanel = Box.createVerticalBox();
+ filterAssemblyPanel.add(Box.createVerticalStrut(10));
+ filterAssemblyPanel.add(btnPanel);
+ filterAssemblyPanel.add(filterExpressionPanel);
+ filterAssemblyPanel.add(Box.createVerticalStrut(10));
+
+ setLayout(new BorderLayout());
+ add(new TWAdvancedSearchPanel.StandardScrollPane(upperPanel), BorderLayout.CENTER);
+ add(filterAssemblyPanel, BorderLayout.PAGE_END);
+ }
+
+ void filterTables() {
+ RowFilter weaponFilter;
+ final int techLevel = cboTechLevel.getSelectedIndex();
+ final String techClass = (String) cboTechClass.getSelectedItem();
+ final int unitType = cboUnitType.getSelectedIndex() - 1;
+ // If current expression doesn't parse, don't update.
+ try {
+ weaponFilter = new RowFilter<>() {
+ @Override
+ public boolean include(Entry extends WeaponsTableModel, ? extends Integer> entry) {
+ WeaponsTableModel weapModel = entry.getModel();
+ WeaponType wp = weapModel.getWeaponTypeAt(entry.getIdentifier());
+ String currTechClass = TechConstants.getTechName(wp.getTechLevel(parentPanel.gameYear));
+
+ boolean techLvlMatch = matchTechLvl(techLevel, wp.getTechLevel(parentPanel.gameYear));
+ boolean techClassMatch = matchTechClass(techClass, currTechClass);
+ boolean unitTypeMatch = matchUnitType(unitType, wp);
+ boolean textFilterMatch = (tableFilterText.getText() == null) || (tableFilterText.getText().length() < 2)
+ || matchWeaponTextFilter(entry, WeaponsTableModel.COL_NAME);
+ return techLvlMatch && techClassMatch && unitTypeMatch && textFilterMatch;
+ }
+ };
+ } catch (PatternSyntaxException ignored) {
+ return;
+ }
+ weaponsSorter.setRowFilter(weaponFilter);
+
+ RowFilter equipmentFilter;
+ try {
+ equipmentFilter = new RowFilter<>() {
+ @Override
+ public boolean include(Entry extends EquipmentTableModel, ? extends Integer> entry) {
+ EquipmentTableModel eqModel = entry.getModel();
+ EquipmentType eq = eqModel.getEquipmentTypeAt(entry.getIdentifier());
+ String currTechClass = TechConstants.getTechName(eq.getTechLevel(parentPanel.gameYear));
+ boolean techLvlMatch = matchTechLvl(techLevel, eq.getTechLevel(parentPanel.gameYear));
+ boolean techClassMatch = matchTechClass(techClass, currTechClass);
+ boolean unitTypeMatch = matchUnitType(unitType, eq);
+ boolean textFilterMatch = (tableFilterText.getText() == null) || (tableFilterText.getText().length() < 2)
+ || matchEquipmentTextFilter(entry, EquipmentTableModel.COL_NAME);
+ return techLvlMatch && techClassMatch && unitTypeMatch && textFilterMatch;
+ }
+ };
+ } catch (PatternSyntaxException ignored) {
+ return;
+ }
+ equipmentSorter.setRowFilter(equipmentFilter);
+ }
+
+ void clear() {
+ filterTokens.clear();
+ tblWeapons.clearSelection();
+ tblEquipment.clearSelection();
+ txtWEEqExp.setText("");
+ adaptTokenButtons();
+ }
+
+ /**
+ * Creates collections for all the possible WeaponType
s and
+ * EquipmentType
s. These are used to populate the weapons
+ * and equipment tables.
+ */
+ private void populateWeaponsAndEquipmentChoices() {
+ List weapons = new ArrayList<>();
+ List equipment = new ArrayList<>();
+
+ for (Enumeration e = EquipmentType.getAllTypes(); e.hasMoreElements();) {
+ EquipmentType et = e.nextElement();
+ if (et instanceof WeaponType) {
+ weapons.add((WeaponType) et);
+ // Check for C3+Tag and C3 Master Booster
+ if (et.hasFlag(WeaponType.F_C3M) || et.hasFlag(WeaponType.F_C3MBS)) {
+ equipment.add(et);
+ }
+ } else if (et instanceof MiscType) {
+ equipment.add(et);
+ }
+ }
+ weaponsModel.setData(weapons);
+ equipmentModel.setData(equipment);
+ }
+
+
+ @Override
+ public void keyPressed(KeyEvent evt) { }
+
+ @Override
+ public void keyReleased(KeyEvent evt) { }
+
+ @Override
+ public void keyTyped(KeyEvent evt) {
+ char keyChar = evt.getKeyChar();
+ // Ensure we've got a number or letter pressed
+ if (!(((keyChar >= '0') && (keyChar <= '9')) ||
+ ((keyChar >= 'a') && (keyChar <= 'z')) || (keyChar == ' '))) {
+ return;
+ }
+
+ if (evt.getComponent().equals(tblWeapons)) {
+ tblWeapons.keyTyped(evt);
+ } else if (evt.getComponent().equals(tblEquipment)) {
+ tblEquipment.keyTyped(evt);
+ }
+ }
+
+ private boolean matchTechClass(String t1, String t2) {
+ if (t1.equals("All")) {
+ return true;
+ } else if (t1.equals("IS/Clan")) {
+ return t2.equals("Inner Sphere") || t2.equals("Clan") || t1.equals(t2);
+ } else {
+ return t1.equals(t2);
+ }
+ }
+
+ private boolean matchUnitType(int unitTypeFilter, EquipmentType eq) {
+ // All is selected
+ if (unitTypeFilter < 0) {
+ return true;
+ }
+
+ switch (unitTypeFilter) {
+ case 5:
+ if (eq.hasFlag(WeaponType.F_AERO_WEAPON) || eq.hasFlag(MiscType.F_FIGHTER_EQUIPMENT)) {
+ return true;
+ }
+ break;
+ case UnitType.BATTLE_ARMOR:
+ if (eq.hasFlag(WeaponType.F_BA_WEAPON) || eq.hasFlag(MiscType.F_BA_EQUIPMENT)) {
+ return true;
+ }
+ break;
+ case UnitType.INFANTRY:
+ if (eq.hasFlag(WeaponType.F_INFANTRY)) {
+ return true;
+ }
+ break;
+ case UnitType.MEK:
+ if (eq.hasFlag(WeaponType.F_MEK_WEAPON) || eq.hasFlag(MiscType.F_MEK_EQUIPMENT)) {
+ return true;
+ }
+ break;
+ case UnitType.TANK:
+ if (eq.hasFlag(WeaponType.F_TANK_WEAPON) || eq.hasFlag(MiscType.F_TANK_EQUIPMENT)) {
+ return true;
+ }
+ break;
+ case UnitType.PROTOMEK:
+ if (eq.hasFlag(WeaponType.F_PROTO_WEAPON) || eq.hasFlag(MiscType.F_PROTOMEK_EQUIPMENT)) {
+ return true;
+ }
+ break;
+ default:
+ return false;
+ }
+ return false;
+ }
+
+ // Build the string representation of the new expression
+ String filterExpressionString() {
+ StringBuilder filterExp = new StringBuilder();
+ for (FilterToken filterTok : filterTokens) {
+ filterExp.append(" ").append(filterTok.toString()).append(" ");
+ }
+ return filterExp.toString();
+ }
+
+ private boolean matchTechLvl(int t1, int t2) {
+ return ((t1 == TechConstants.T_ALL) || (t1 == t2)
+ || ((t1 == TechConstants.T_IS_TW_ALL) && (t2 <= TechConstants.T_IS_TW_NON_BOX)))
+
+ || ((t1 == TechConstants.T_TW_ALL) && (t2 <= TechConstants.T_CLAN_TW))
+
+ || ((t1 == TechConstants.T_ALL_IS) && ((t2 <= TechConstants.T_IS_TW_NON_BOX)
+ || (t2 == TechConstants.T_IS_ADVANCED)
+ || (t2 == TechConstants.T_IS_EXPERIMENTAL)
+ || (t2 == TechConstants.T_IS_UNOFFICIAL)))
+
+ || ((t1 == TechConstants.T_ALL_CLAN)
+ && ((t2 == TechConstants.T_CLAN_TW)
+ || (t2 == TechConstants.T_CLAN_ADVANCED)
+ || (t2 == TechConstants.T_CLAN_EXPERIMENTAL)
+ || (t2 == TechConstants.T_CLAN_UNOFFICIAL)));
+ }
+
+ private void addButtonPressed() {
+ if ((focusedSelector == tblEquipment) && (tblEquipment.getSelectedRow() != -1)) {
+ int row = tblEquipment.getSelectedRow();
+ String internalName = (String) tblEquipment.getModel().getValueAt(
+ tblEquipment.convertRowIndexToModel(row),
+ EquipmentTableModel.COL_INTERNAL_NAME);
+ String fullName = (String) tblEquipment.getValueAt(row, EquipmentTableModel.COL_NAME);
+ int qty = Integer.parseInt((String) tblEquipment.getValueAt(row, EquipmentTableModel.COL_QTY));
+ filterTokens.add(new EquipmentTypeFT(internalName, fullName, qty));
+
+ } else if ((focusedSelector == tblWeapons) && (tblWeapons.getSelectedRow() != -1)) {
+ int row = tblWeapons.getSelectedRow();
+ String internalName = (String) tblWeapons.getModel().getValueAt(
+ tblWeapons.convertRowIndexToModel(row),
+ WeaponsTableModel.COL_INTERNAL_NAME);
+ String fullName = (String) tblWeapons.getValueAt(row, WeaponsTableModel.COL_NAME);
+ int qty = Integer.parseInt((String) tblWeapons.getValueAt(row, WeaponsTableModel.COL_QTY));
+ filterTokens.add(new EquipmentTypeFT(internalName, fullName, qty));
+
+ } else if ((focusedSelector == weaponClassChooser) && (weaponClassChooser.getSelectedItem() != null)) {
+ int qty = (int) weaponClassCount.getValue();
+ filterTokens.add(new WeaponClassFT((WeaponClass) weaponClassChooser.getSelectedItem(), qty));
+
+ } else {
+ // if something else is focused, do nothing
+ return;
+ }
+ txtWEEqExp.setText(filterExpressionString());
+ adaptTokenButtons();
+ }
+
+ private boolean matchWeaponTextFilter(RowFilter.Entry extends WeaponsTableModel, ? extends Integer> entry, int column) {
+ String wp = entry.getModel().getValueAt(entry.getIdentifier(), column).toString();
+ return matchTextFilter(wp);
+ }
+
+ private boolean matchEquipmentTextFilter(RowFilter.Entry extends EquipmentTableModel, ? extends Integer> entry, int column) {
+ String wp = entry.getModel().getValueAt(entry.getIdentifier(), column).toString();
+ return matchTextFilter(wp);
+ }
+
+ private boolean matchTextFilter(String tableText) {
+ return tableText.toLowerCase(Locale.ROOT).contains(tableFilterText.getText().toLowerCase(Locale.ROOT));
+ }
+
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ filterTables();
+ }
+
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ filterTables();
+ }
+
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+ filterTables();
+ }
+
+ @Override
+ public void focusGained(FocusEvent e) {
+ if ((e.getSource() == tblEquipment) || (e.getSource() == tblWeapons)) {
+ focusedSelector = (JComponent) e.getSource();
+ adaptTokenButtons();
+ } else if (e.getSource() == weaponClassChooser) {
+ focusWeaponClasschooser();
+ }
+ }
+
+ @Override
+ public void focusLost(FocusEvent e) { }
+
+ private void spinnerChange() {
+ focusWeaponClasschooser();
+ }
+
+ private void focusWeaponClasschooser() {
+ focusedSelector = weaponClassChooser;
+ tblWeapons.clearSelection();
+ tblEquipment.clearSelection();
+ adaptTokenButtons();
+ }
+
+ private @Nullable FilterToken lastToken() {
+ return filterTokens.isEmpty() ? null : filterTokens.get(filterTokens.size() - 1);
+ }
+
+ private boolean hasFocusedSelector() {
+ return (focusedSelector == weaponClassChooser) || (focusedSelector == tblEquipment) || (focusedSelector == tblWeapons);
+ }
+
+ void adaptTokenButtons() {
+ btnBack.setEnabled(!filterTokens.isEmpty());
+ btnClear.setEnabled(!filterTokens.isEmpty());
+
+ boolean canAddEquipment = filterTokens.isEmpty() || (lastToken() instanceof OperatorFT)
+ || (lastToken() instanceof LeftParensFilterToken);
+ btnAdd.setEnabled(hasFocusedSelector() && canAddEquipment);
+ btnLeftParen.setEnabled(canAddEquipment);
+
+ boolean canAddOperator = (lastToken() instanceof EquipmentFilterToken) || (lastToken() instanceof RightParensFilterToken);
+ btnAnd.setEnabled(canAddOperator);
+ btnOr.setEnabled(canAddOperator);
+ btnRightParen.setEnabled(canAddOperator);
+ }
+
+ private void addFilterToken(FilterToken token) {
+ filterTokens.add(token);
+ txtWEEqExp.setText(filterExpressionString());
+ adaptTokenButtons();
+ }
+
+ private void backOperation() {
+ if (!filterTokens.isEmpty()) {
+ filterTokens.remove(filterTokens.size() - 1);
+ txtWEEqExp.setText(filterExpressionString());
+ adaptTokenButtons();
+ }
+ }
+}
diff --git a/megamek/src/megamek/client/ui/advancedsearch/WeaponsTableModel.java b/megamek/src/megamek/client/ui/advancedsearch/WeaponsTableModel.java
new file mode 100644
index 0000000000..04bfe77469
--- /dev/null
+++ b/megamek/src/megamek/client/ui/advancedsearch/WeaponsTableModel.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2024 - The MegaMek Team. All Rights Reserved.
+ *
+ * This file is part of MegaMek.
+ *
+ * MegaMek is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MegaMek is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MegaMek. If not, see .
+ */
+package megamek.client.ui.advancedsearch;
+
+import megamek.common.TechConstants;
+import megamek.common.WeaponType;
+
+import javax.swing.table.AbstractTableModel;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * A table model for displaying weapons
+ */
+public class WeaponsTableModel extends AbstractTableModel {
+
+ static final int COL_QTY = 0;
+ static final int COL_NAME = 1;
+ static final int COL_DMG = 2;
+ static final int COL_HEAT = 3;
+ static final int COL_SHORT = 4;
+ static final int COL_MED = 5;
+ static final int COL_LONG = 6;
+ static final int COL_IS_CLAN = 7;
+ static final int COL_LEVEL = 8;
+ static final int N_COL = 9;
+ static final int COL_INTERNAL_NAME = 9;
+
+ private final TWAdvancedSearchPanel twAdvancedSearchPanel;
+ private int[] qty;
+
+ private List weapons = new ArrayList<>();
+
+ public WeaponsTableModel(TWAdvancedSearchPanel twAdvancedSearchPanel) {
+ this.twAdvancedSearchPanel = twAdvancedSearchPanel;
+ }
+
+ @Override
+ public int getRowCount() {
+ return weapons.size();
+ }
+
+ @Override
+ public int getColumnCount() {
+ return N_COL;
+ }
+
+ public int getPreferredWidth(int col) {
+ return switch (col) {
+ case COL_QTY -> 40;
+ case COL_NAME -> 310;
+ case COL_IS_CLAN -> 75;
+ case COL_DMG, COL_HEAT, COL_SHORT, COL_MED, COL_LONG -> 50;
+ case COL_LEVEL -> 100;
+ default -> 0;
+ };
+ }
+
+ @Override
+ public String getColumnName(int column) {
+ return switch (column) {
+ case COL_QTY -> "Qty";
+ case COL_NAME -> "Weapon Name";
+ case COL_IS_CLAN -> "IS/Clan";
+ case COL_DMG -> "DMG";
+ case COL_HEAT -> "Heat";
+ case COL_SHORT -> "Short";
+ case COL_MED -> "Med";
+ case COL_LONG -> "Long";
+ case COL_LEVEL -> "Lvl";
+ default -> "?";
+ };
+ }
+
+ @Override
+ public Class> getColumnClass(int c) {
+ return getValueAt(0, c).getClass();
+ }
+
+ @Override
+ public boolean isCellEditable(int row, int col) {
+ return col == COL_QTY;
+ }
+
+ public void setData(List wps) {
+ weapons = wps;
+ qty = new int[wps.size()];
+ Arrays.fill(qty, 1);
+ fireTableDataChanged();
+ }
+
+ public WeaponType getWeaponTypeAt(int row) {
+ return weapons.get(row);
+ }
+
+ @Override
+ public Object getValueAt(int row, int col) {
+ if (row >= weapons.size()) {
+ return null;
+ }
+ WeaponType wp = weapons.get(row);
+ return switch (col) {
+ case COL_QTY -> qty[row] + "";
+ case COL_NAME -> wp.getName();
+ case COL_IS_CLAN -> TechConstants.getTechName(wp.getTechLevel(twAdvancedSearchPanel.gameYear));
+ case COL_DMG -> wp.getDamage();
+ case COL_HEAT -> wp.getHeat();
+ case COL_SHORT -> wp.getShortRange();
+ case COL_MED -> wp.getMediumRange();
+ case COL_LONG -> wp.getLongRange();
+ case COL_LEVEL -> TechConstants.getSimpleLevelName(
+ TechConstants.convertFromNormalToSimple(wp.getTechLevel(twAdvancedSearchPanel.gameYear)));
+ case COL_INTERNAL_NAME -> wp.getInternalName();
+ default -> "?";
+ };
+ }
+
+ @Override
+ public void setValueAt(Object value, int row, int col) {
+ if (col == COL_QTY) {
+ qty[row] = Integer.parseInt((String) value);
+ fireTableCellUpdated(row, col);
+ }
+ }
+}
diff --git a/megamek/src/megamek/client/ui/swing/AdvancedSearchDialog.java b/megamek/src/megamek/client/ui/swing/AdvancedSearchDialog.java
deleted file mode 100644
index cbf3482b42..0000000000
--- a/megamek/src/megamek/client/ui/swing/AdvancedSearchDialog.java
+++ /dev/null
@@ -1,1417 +0,0 @@
-/*
- * MegaMek - Copyright (C) 2002, 2003 Ben Mazur (bmazur@sev.org)
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- */
-package megamek.client.ui.swing;
-
-import java.awt.BorderLayout;
-import java.awt.Font;
-import java.awt.Frame;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.Label;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.WindowAdapter;
-import java.awt.event.WindowEvent;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.Vector;
-
-import javax.swing.*;
-import javax.swing.RowSorter.SortKey;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import javax.swing.table.AbstractTableModel;
-import javax.swing.table.TableColumn;
-import javax.swing.table.TableRowSorter;
-
-import megamek.MMConstants;
-import megamek.client.ui.Messages;
-import megamek.client.ui.swing.table.MegaMekTable;
-import megamek.client.ui.swing.unitSelector.TWAdvancedSearchPanel;
-import megamek.common.EquipmentType;
-import megamek.common.Mek;
-import megamek.common.MekSearchFilter;
-import megamek.common.MiscType;
-import megamek.common.TechConstants;
-import megamek.common.UnitType;
-import megamek.common.WeaponType;
-import megamek.common.equipment.ArmorType;
-
-/**
- * JDialog that allows the user to create a unit filter.
- *
- * @author Arlith
- * @author Jay Lawson
- */
-public class AdvancedSearchDialog extends JDialog implements ActionListener, ItemListener,
- KeyListener, ListSelectionListener {
- private static final long serialVersionUID = 1L;
- private boolean isCanceled = true;
- public MekSearchFilter mekFilter = null;
- private Vector filterToks;
- private JButton btnOkay = new JButton(Messages.getString("Okay"));
- private JButton btnCancel = new JButton(Messages.getString("Cancel"));
-
- private JButton btnLeftParen = new JButton("(");
- private JButton btnRightParen = new JButton(")");
- private JButton btnAdd = new JButton(Messages.getString("MekSelectorDialog.Search.add"));
- private JButton btnAnd = new JButton(Messages.getString("MekSelectorDialog.Search.and"));
- private JButton btnOr = new JButton(Messages.getString("MekSelectorDialog.Search.or"));
- private JButton btnClear = new JButton(Messages.getString("MekSelectorDialog.Reset"));
- private JButton btnBack = new JButton("Back");
-
- private JLabel lblEqExpTxt = new JLabel(Messages.getString("MekSelectorDialog.Search.FilterExpression"));
- private JTextArea txtEqExp = new JTextArea("");
- private JScrollPane expScroller = new JScrollPane(txtEqExp,
- JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
- JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
-
- private JLabel lblWalk = new JLabel(Messages.getString("MekSelectorDialog.Search.Walk"));
- private JTextField tStartWalk = new JTextField(4);
- private JTextField tEndWalk = new JTextField(4);
-
- private JLabel lblJump = new JLabel(Messages.getString("MekSelectorDialog.Search.Jump"));
- private JTextField tStartJump = new JTextField(4);
- private JTextField tEndJump = new JTextField(4);
-
- private JLabel lblArmor = new JLabel(Messages.getString("MekSelectorDialog.Search.Armor"));
- private JComboBox cArmor = new JComboBox<>();
-
- private JLabel lblTableFilters = new JLabel(Messages.getString("MekSelectorDialog.Search.TableFilters"));
- private JLabel lblUnitType = new JLabel(Messages.getString("MekSelectorDialog.Search.UnitType"));
- private JLabel lblTechClass = new JLabel(Messages.getString("MekSelectorDialog.Search.TechClass"));
- private JLabel lblTechLevel = new JLabel(Messages.getString("MekSelectorDialog.Search.TechLevel"));
- private JComboBox cboUnitType = new JComboBox<>();
- private JComboBox cboTechClass = new JComboBox<>();
- private JComboBox cboTechLevel = new JComboBox<>();
-
- private JLabel lblWeapons = new JLabel(Messages.getString("MekSelectorDialog.Search.Weapons"));
- private JScrollPane scrTableWeapons = new JScrollPane();
- private MegaMekTable tblWeapons;
- private WeaponsTableModel weaponsModel;
- private TableRowSorter weaponsSorter;
-
- private JLabel lblEquipment = new JLabel(Messages.getString("MekSelectorDialog.Search.Equipment"));
- private JScrollPane scrTableEquipment = new JScrollPane();
- private MegaMekTable tblEquipment;
- private EquipmentTableModel equipmentModel;
- private TableRowSorter equipmentSorter;
-
- private JLabel lblYear = new JLabel(Messages.getString("MekSelectorDialog.Search.Year"));
- private JTextField tStartYear = new JTextField(4);
- private JTextField tEndYear = new JTextField(4);
- private JLabel lblCockpitType = new JLabel(Messages.getString("MekSelectorDialog.Search.CockpitType"));
- private JList listCockpitType = new JList<>(new DefaultListModel());
- private JScrollPane spCockpitType = new JScrollPane(listCockpitType);
- private JLabel lblArmorType = new JLabel(Messages.getString("MekSelectorDialog.Search.ArmorType"));
- private JList listArmorType = new JList<>(new DefaultListModel());
- private JScrollPane spArmorType = new JScrollPane(listArmorType);
- private JLabel lblInternalsType = new JLabel(Messages.getString("MekSelectorDialog.Search.InternalsType"));
- private JList listInternalsType = new JList<>(new DefaultListModel());
- private JScrollPane spInternalsType = new JScrollPane(listInternalsType);
- private JComboBox cboQty = new JComboBox<>();
-
- /**
- * Stores the games current year.
- */
- private int gameYear;
-
- private static class NoSelectionModel extends DefaultListSelectionModel {
- @Override
- public void setAnchorSelectionIndex(final int anchorIndex) {
- }
-
- @Override
- public void setLeadAnchorNotificationEnabled(final boolean flag) {
- }
-
- @Override
- public void setLeadSelectionIndex(final int leadIndex) {
- }
-
- @Override
- public void setSelectionInterval(final int index0, final int index1) {
- }
- }
-
- private void toggleText(JList list, int index) {
- ListModel m = list.getModel();
- DefaultListModel dlm = new DefaultListModel<>();
-
- for (int i = 0; i < m.getSize(); i++) {
- String ms = m.getElementAt(i);
-
- if (index == i) {
- if (ms.contains("\u2610")) {
- dlm.addElement("\u2611" + ms.substring(1, ms.length()));
- } else if (ms.contains("\u2611")) {
- dlm.addElement("\u2612" + ms.substring(1, ms.length()));
- } else if (ms.contains("\u2612")) {
- dlm.addElement("\u2610" + ms.substring(1, ms.length()));
- }
- } else {
- dlm.addElement(ms);
- }
- }
-
- list.setModel(dlm);
- }
-
- /**
- * Constructs a new AdvancedSearchDialog.
- *
- * @param frame Parent frame
- */
- public AdvancedSearchDialog(Frame frame, int yr) {
- super(frame, Messages.getString("AdvancedSearchDialog.title"), true);
-
- gameYear = yr;
-
- filterToks = new Vector<>(30);
-
- // Initialize Items
- btnOkay.addActionListener(this);
- btnCancel.addActionListener(this);
- btnAnd.addActionListener(this);
- btnAdd.addActionListener(this);
- btnLeftParen.addActionListener(this);
- btnRightParen.addActionListener(this);
- btnOr.addActionListener(this);
- btnClear.addActionListener(this);
- btnBack.addActionListener(this);
-
- btnBack.setEnabled(false);
- btnAdd.setEnabled(false);
-
- cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Any"));
- cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor25"));
- cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor50"));
- cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor75"));
- cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor90"));
-
- DefaultListModel dlma = new DefaultListModel<>();
-
- for (String armor : ArmorType.allArmorNames()) {
- dlma.addElement("\u2610 " + armor);
- }
-
- listArmorType.setModel(dlma);
-
- listArmorType.setVisibleRowCount(7);
- listArmorType.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- listArmorType.setSelectionModel(new NoSelectionModel());
- listArmorType.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- super.mouseClicked(e);
- if (e.getButton() == MouseEvent.BUTTON1) {
- JList list = (JList) e.getSource();
- int index = list.locationToIndex(e.getPoint());
- toggleText(list, index);
- }
- }
- });
-
- DefaultListModel dlmc = new DefaultListModel<>();
-
- for (int i = 0; i < Mek.COCKPIT_STRING.length; i++) {
- dlmc.addElement("\u2610 " + Mek.COCKPIT_STRING[i]);
- }
-
- listCockpitType.setModel(dlmc);
-
- listCockpitType.setVisibleRowCount(5);
- listCockpitType.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- listCockpitType.setSelectionModel(new NoSelectionModel());
- listCockpitType.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- super.mouseClicked(e);
- if (e.getButton() == MouseEvent.BUTTON1) {
- JList list = (JList) e.getSource();
- int index = list.locationToIndex(e.getPoint());
- toggleText(list, index);
- }
- }
- });
-
- DefaultListModel dlmi = new DefaultListModel<>();
-
- for (int i = 0; i < EquipmentType.structureNames.length; i++) {
- dlmi.addElement("\u2610 " + EquipmentType.structureNames[i]);
- }
-
- listInternalsType.setModel(dlmi);
-
- listInternalsType.setVisibleRowCount(5);
- listInternalsType.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- listInternalsType.setSelectionModel(new NoSelectionModel());
- listInternalsType.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- super.mouseClicked(e);
- if (e.getButton() == MouseEvent.BUTTON1) {
- JList list = (JList) e.getSource();
- int index = list.locationToIndex(e.getPoint());
- toggleText(list, index);
- }
- }
- });
-
- for (int i = 0; i <= 20; i++) {
- cboQty.addItem(Integer.toString(i));
- }
- cboQty.setSelectedIndex(0);
-
- // Setup table filter combo boxes
- DefaultComboBoxModel unitTypeModel = new DefaultComboBoxModel<>();
- unitTypeModel.addElement(Messages.getString("MekSelectorDialog.All"));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.MEK));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.TANK));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.BATTLE_ARMOR));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.INFANTRY));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.PROTOMEK));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.AEROSPACEFIGHTER));
- unitTypeModel.setSelectedItem(Messages.getString("MekSelectorDialog.All"));
-
- cboUnitType.setModel(unitTypeModel);
- cboUnitType.addActionListener(this);
-
- DefaultComboBoxModel techLevelModel = new DefaultComboBoxModel<>();
- for (int i = 0; i < TechConstants.SIZE; i++) {
- techLevelModel.addElement(TechConstants.getLevelDisplayableName(i));
- }
- techLevelModel.setSelectedItem(TechConstants.getLevelDisplayableName(TechConstants.SIZE - 1));
- cboTechLevel.setModel(techLevelModel);
- cboTechLevel.addActionListener(this);
-
- DefaultComboBoxModel techClassModel = new DefaultComboBoxModel<>();
- techClassModel.addElement("All");
- techClassModel.addElement("Inner Sphere");
- techClassModel.addElement("Clan");
- techClassModel.addElement("IS/Clan");
- techClassModel.addElement("(Unknown Technology Base)");
- techClassModel.setSelectedItem("All");
- cboTechClass.setModel(techClassModel);
- cboTechClass.addActionListener(this);
-
- // Setup Weapons Table
- weaponsModel = new WeaponsTableModel();
- tblWeapons = new MegaMekTable(weaponsModel, WeaponsTableModel.COL_NAME);
- TableColumn wpsCol = tblWeapons.getColumnModel().getColumn(
- WeaponsTableModel.COL_QTY);
- wpsCol.setCellEditor(new DefaultCellEditor(cboQty));
- tblWeapons.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- weaponsSorter = new TableRowSorter<>(weaponsModel);
- tblWeapons.setRowSorter(weaponsSorter);
- tblWeapons.addKeyListener(this);
- tblWeapons.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12));
- tblWeapons.getSelectionModel().addListSelectionListener(this);
- for (int i = 0; i < weaponsModel.getColumnCount(); i++) {
- tblWeapons.getColumnModel().getColumn(i).setPreferredWidth(weaponsModel.getPreferredWidth(i));
- }
- scrTableWeapons.setViewportView(tblWeapons);
-
- // Setup Equipment Table
- equipmentModel = new EquipmentTableModel();
- tblEquipment = new MegaMekTable(equipmentModel,
- EquipmentTableModel.COL_NAME);
- TableColumn eqCol = tblEquipment.getColumnModel().getColumn(
- EquipmentTableModel.COL_QTY);
- eqCol.setCellEditor(new DefaultCellEditor(cboQty));
- tblEquipment.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- equipmentSorter = new TableRowSorter<>(equipmentModel);
- tblEquipment.setRowSorter(equipmentSorter);
- tblEquipment.addKeyListener(this);
- tblEquipment.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12));
- tblEquipment.getSelectionModel().addListSelectionListener(this);
- for (int i = 0; i < tblEquipment.getColumnCount(); i++) {
- tblEquipment.getColumnModel().getColumn(i).setPreferredWidth(equipmentModel.getPreferredWidth(i));
- }
- scrTableEquipment.setViewportView(tblEquipment);
-
- // Populate Tables
- populateWeaponsAndEquipmentChoices();
-
- // initialize with the weapons sorted alphabetically by name
- ArrayList sortlist = new ArrayList<>();
- sortlist.add(new SortKey(WeaponsTableModel.COL_NAME, SortOrder.ASCENDING));
- tblWeapons.getRowSorter().setSortKeys(sortlist);
- ((DefaultRowSorter, ?>) tblWeapons.getRowSorter()).sort();
- tblWeapons.invalidate(); // force re-layout of window
-
- // initialize with the equipment sorted alphabetically by chassis
- sortlist = new ArrayList<>();
- sortlist.add(new SortKey(EquipmentTableModel.COL_NAME, SortOrder.ASCENDING));
- tblEquipment.getRowSorter().setSortKeys(sortlist);
- ((DefaultRowSorter, ?>) tblEquipment.getRowSorter()).sort();
- tblEquipment.invalidate(); // force re-layout of window
-
- txtEqExp.setEditable(false);
- txtEqExp.setLineWrap(true);
- txtEqExp.setWrapStyleWord(true);
-
- // Layout
- GridBagConstraints c = new GridBagConstraints();
- JPanel mainPanel = new JPanel(new GridBagLayout());
-
- c.weighty = 0;
- c.fill = GridBagConstraints.NONE;
- c.anchor = GridBagConstraints.WEST;
- c.insets = new Insets(0, 10, 0, 0);
- c.gridx = 0;
- c.gridy = 0;
- mainPanel.add(lblWalk, c);
- c.gridx = 1;
- c.gridy = 0;
- c.insets = new Insets(0, 0, 0, 0);
- c.anchor = GridBagConstraints.EAST;
- JPanel panWalk = new JPanel();
- panWalk.add(tStartWalk);
- panWalk.add(new Label("-"));
- panWalk.add(tEndWalk);
- mainPanel.add(panWalk, c);
- c.gridx = 3;
- c.gridy = 0;
- c.insets = new Insets(0, 40, 0, 0);
- c.anchor = GridBagConstraints.WEST;
- JPanel cockpitPanel = new JPanel(new BorderLayout());
- cockpitPanel.add(lblCockpitType, BorderLayout.NORTH);
- cockpitPanel.add(spCockpitType, BorderLayout.SOUTH);
- mainPanel.add(cockpitPanel, c);
-
- c.gridx = 0;
- c.gridy = 1;
- c.anchor = GridBagConstraints.WEST;
- c.insets = new Insets(0, 10, 0, 0);
- mainPanel.add(lblJump, c);
- c.insets = new Insets(0, 0, 0, 0);
- c.gridx = 1;
- c.gridy = 1;
- c.anchor = GridBagConstraints.EAST;
- JPanel panJump = new JPanel();
- panJump.add(tStartJump);
- panJump.add(new Label("-"));
- panJump.add(tEndJump);
- mainPanel.add(panJump, c);
- c.anchor = GridBagConstraints.WEST;
- c.gridx = 3;
- c.gridy = 1;
- c.insets = new Insets(0, 40, 0, 0);
- JPanel internalsPanel = new JPanel(new BorderLayout());
- internalsPanel.add(lblInternalsType, BorderLayout.NORTH);
- internalsPanel.add(spInternalsType, BorderLayout.EAST);
- mainPanel.add(internalsPanel, c);
-
- c.anchor = GridBagConstraints.WEST;
- c.gridx = 0;
- c.gridy++;
- c.insets = new Insets(0, 10, 0, 0);
- mainPanel.add(lblArmor, c);
- c.insets = new Insets(0, 0, 0, 0);
- c.gridx = 1;
- mainPanel.add(cArmor, c);
- c.gridx = 3;
- c.insets = new Insets(0, 40, 0, 0);
- JPanel armorPanel = new JPanel(new BorderLayout());
- armorPanel.add(lblArmorType, BorderLayout.NORTH);
- armorPanel.add(spArmorType, BorderLayout.EAST);
- mainPanel.add(armorPanel, c);
-
- c.anchor = GridBagConstraints.CENTER;
- c.insets = new Insets(16, 0, 0, 0);
- c.gridx = 0;
- c.gridy++;
- mainPanel.add(lblTableFilters, c);
- c.insets = new Insets(0, 0, 0, 0);
- c.gridx = 0;
- c.gridy++;
- c.gridwidth = 4;
- JPanel cboPanel = new JPanel();
- cboPanel.add(lblUnitType);
- cboPanel.add(cboUnitType);
- cboPanel.add(lblTechClass);
- cboPanel.add(cboTechClass);
- cboPanel.add(lblTechLevel, c);
- cboPanel.add(cboTechLevel, c);
- mainPanel.add(cboPanel, c);
- c.gridwidth = 1;
-
- c.insets = new Insets(0, 0, 0, 0);
- c.gridx = 0;
- c.gridy++;
- mainPanel.add(lblWeapons, c);
-
- c.insets = new Insets(0, 0, 0, 0);
- c.gridwidth = 4;
- c.gridx = 0;
- c.gridy++;
- mainPanel.add(scrTableWeapons, c);
-
- c.gridwidth = 1;
- c.insets = new Insets(16, 0, 0, 0);
- c.gridx = 0;
- c.gridy++;
- mainPanel.add(lblEquipment, c);
-
- c.insets = new Insets(0, 0, 0, 0);
- c.gridwidth = 4;
- c.gridx = 0;
- c.gridy++;
- mainPanel.add(scrTableEquipment, c);
-
- c.gridx = 0;
- c.gridy++;
- c.gridwidth = 4;
- JPanel btnPanel = new JPanel();
- btnPanel.add(btnAdd, c);
- btnPanel.add(btnLeftParen, c);
- btnPanel.add(btnRightParen, c);
- btnPanel.add(btnAnd, c);
- btnPanel.add(btnOr, c);
- btnPanel.add(btnBack, c);
- btnPanel.add(btnClear, c);
- mainPanel.add(btnPanel, c);
- c.gridwidth = 1;
-
- // Filter Expression
- c.gridx = 0;
- c.gridy++;
- mainPanel.add(lblEqExpTxt, c);
- c.fill = GridBagConstraints.BOTH;
- c.gridwidth = 4;
- c.gridx = 1;
- mainPanel.add(expScroller, c);
- c.fill = GridBagConstraints.NONE;
- c.insets = new Insets(0, 0, 0, 0);
-
- c.gridwidth = 1;
- c.gridx = 0;
- c.gridy++;
- mainPanel.add(lblYear, c);
- c.gridx = 1;
- JPanel designYearPanel = new JPanel();
- designYearPanel.add(tStartYear);
- designYearPanel.add(new Label("-"));
- designYearPanel.add(tEndYear);
- mainPanel.add(designYearPanel, c);
-
- c.gridwidth = 1;
- c.gridx = 2;
- c.gridy++;
- c.anchor = GridBagConstraints.EAST;
- c.insets = new Insets(0, 20, 10, 0);
- mainPanel.add(btnOkay, c);
- c.gridx = 3;
- c.insets = new Insets(0, 20, 10, 0);
- c.anchor = GridBagConstraints.WEST;
- mainPanel.add(btnCancel, c);
-
- JScrollPane mainScrollPane = new JScrollPane(mainPanel);
- add(mainScrollPane);
-
- addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(WindowEvent evt) {
- setVisible(false);
- }
- });
-
- pack();
- int x = Math.max(0,
- (frame.getLocation().x + (frame.getSize().width / 2)) -
- (getSize().width / 2));
- int y = Math.max(0,
- (frame.getLocation().y + (frame.getSize().height / 2)) -
- (getSize().height / 2));
- setLocation(x, y);
- }
-
- /**
- * Listener for check box state changes
- */
- @Override
- public void itemStateChanged(ItemEvent e) {
-
- }
-
- /**
- * Selection Listener for Weapons and Equipment tables. Checks to see if
- * a row is selected and if it is, enables the corresponding the add button.
- */
- @Override
- public void valueChanged(ListSelectionEvent evt) {
- boolean lastTokIsOperation;
- int tokSize = filterToks.size();
- lastTokIsOperation = ((tokSize == 0) ||
- (filterToks.elementAt(tokSize - 1) instanceof TWAdvancedSearchPanel.OperationFT));
- if (evt.getSource().equals(tblWeapons.getSelectionModel())) {
- if ((tblWeapons.getSelectedRow() >= 0) && lastTokIsOperation) {
- tblEquipment.clearSelection();
- btnAdd.setEnabled(true);
- } else if (tblWeapons.getSelectedRow() >= 0) {
- tblEquipment.clearSelection();
- }
- } else if (evt.getSource().equals(tblEquipment.getSelectionModel())) {
- if ((tblEquipment.getSelectedRow() >= 0) && lastTokIsOperation) {
- tblWeapons.clearSelection();
- btnAdd.setEnabled(true);
- } else if (tblEquipment.getSelectedRow() >= 0) {
- tblWeapons.clearSelection();
- }
- }
- }
-
- /**
- * Convenience method for enabling the buttons related to weapon/equipment
- * selection for filtering (btnAddEquipment, btnAddWeapon, etc)
- */
- private void enableSelectionButtons() {
- if ((tblWeapons.getSelectedRow() != -1) ||
- (tblEquipment.getSelectedRow() != -1)) {
- btnAdd.setEnabled(true);
- }
- btnLeftParen.setEnabled(true);
- }
-
- /**
- * Convenience method for disabling the buttons related to weapon/equipment
- * selection for filtering (btnAddEquipment, btnAddWeapon, etc)
- */
- private void disableSelectionButtons() {
- btnAdd.setEnabled(false);
- btnLeftParen.setEnabled(false);
- }
-
- /**
- * Convenience method for enabling the buttons related to filter operations
- * for filtering (btnAnd, btnOr, etc)
- */
- private void enableOperationButtons() {
- btnOr.setEnabled(true);
- btnAnd.setEnabled(true);
- btnRightParen.setEnabled(true);
- }
-
- /**
- * Convenience method for disabling the buttons related to filter operations
- * for filtering (btnAnd, btnOr, etc)
- */
- private void disableOperationButtons() {
- btnOr.setEnabled(false);
- btnAnd.setEnabled(false);
- btnRightParen.setEnabled(false);
- }
-
- /**
- * Listener for button presses.
- */
- @Override
- public void actionPerformed(java.awt.event.ActionEvent ev) {
- if (ev.getSource().equals(btnOkay)) {
- isCanceled = false;
- try {
- mekFilter.createFilterExpressionFromTokens(filterToks);
- setVisible(false);
- } catch (MekSearchFilter.FilterParsingException e) {
- JOptionPane.showMessageDialog(this,
- "Error parsing filter expression!\n\n" + e.msg,
- "Filter Expression Parsing Error",
- JOptionPane.ERROR_MESSAGE);
- }
- } else if (ev.getSource().equals(btnCancel)) {
- isCanceled = true;
- setVisible(false);
- } else if (ev.getSource().equals(cboUnitType)
- || ev.getSource().equals(cboTechLevel)
- || ev.getSource().equals(cboTechClass)) {
- filterTables();
- } else if (ev.getSource().equals(btnAdd)) {
- int row = tblEquipment.getSelectedRow();
- if (row >= 0) {
- String internalName = (String) tblEquipment.getModel().getValueAt(
- tblEquipment.convertRowIndexToModel(row),
- EquipmentTableModel.COL_INTERNAL_NAME);
- String fullName = (String) tblEquipment.getValueAt(row, EquipmentTableModel.COL_NAME);
- int qty = Integer.parseInt((String) tblEquipment.getValueAt(row, EquipmentTableModel.COL_QTY));
- filterToks.add(new TWAdvancedSearchPanel.EquipmentFT(internalName, fullName, qty));
- txtEqExp.setText(filterExpressionString());
- btnBack.setEnabled(true);
- enableOperationButtons();
- disableSelectionButtons();
- }
- row = tblWeapons.getSelectedRow();
- if (row >= 0) {
- String internalName = (String) tblWeapons.getModel().getValueAt(
- tblWeapons.convertRowIndexToModel(row),
- WeaponsTableModel.COL_INTERNAL_NAME);
- String fullName = (String) tblWeapons.getValueAt(row, WeaponsTableModel.COL_NAME);
- int qty = Integer.parseInt((String) tblWeapons.getValueAt(row, WeaponsTableModel.COL_QTY));
- filterToks.add(new TWAdvancedSearchPanel.EquipmentFT(internalName, fullName, qty));
- txtEqExp.setText(filterExpressionString());
- btnBack.setEnabled(true);
- enableOperationButtons();
- disableSelectionButtons();
- }
- } else if (ev.getSource().equals(btnLeftParen)) {
- filterToks.add(new TWAdvancedSearchPanel.ParensFT("("));
- txtEqExp.setText(filterExpressionString());
- btnBack.setEnabled(true);
- disableOperationButtons();
- enableSelectionButtons();
- btnLeftParen.setEnabled(false);
- btnRightParen.setEnabled(false);
- } else if (ev.getSource().equals(btnRightParen)) {
- filterToks.add(new TWAdvancedSearchPanel.ParensFT(")"));
- txtEqExp.setText(filterExpressionString());
- btnBack.setEnabled(true);
- enableOperationButtons();
- disableSelectionButtons();
- btnLeftParen.setEnabled(false);
- btnRightParen.setEnabled(false);
- } else if (ev.getSource().equals(btnAnd)) {
- filterToks.add(new TWAdvancedSearchPanel.OperationFT(MekSearchFilter.BoolOp.AND));
- txtEqExp.setText(filterExpressionString());
- btnBack.setEnabled(true);
- disableOperationButtons();
- enableSelectionButtons();
- } else if (ev.getSource().equals(btnOr)) {
- filterToks.add(new TWAdvancedSearchPanel.OperationFT(MekSearchFilter.BoolOp.OR));
- txtEqExp.setText(filterExpressionString());
- btnBack.setEnabled(true);
- disableOperationButtons();
- enableSelectionButtons();
- } else if (ev.getSource().equals(btnBack)) {
- if (!filterToks.isEmpty()) {
- filterToks.remove(filterToks.size() - 1);
- txtEqExp.setText(filterExpressionString());
- if (filterToks.isEmpty()) {
- btnBack.setEnabled(false);
- }
-
- if ((filterToks.isEmpty()) || (filterToks.lastElement() instanceof TWAdvancedSearchPanel.OperationFT)) {
- disableOperationButtons();
- enableSelectionButtons();
- } else {
- enableOperationButtons();
- disableSelectionButtons();
- }
- }
- } else if (ev.getSource().equals(btnClear)) {
- filterToks.clear();
- txtEqExp.setText("");
- btnBack.setEnabled(false);
- disableOperationButtons();
- enableSelectionButtons();
- }
- }
-
- private boolean matchTechLvl(int t1, int t2) {
- return ((t1 == TechConstants.T_ALL)
- || (t1 == t2)
- || ((t1 == TechConstants.T_IS_TW_ALL)
- && ((t2 <= TechConstants.T_IS_TW_NON_BOX)
- || ((t2) == TechConstants.T_INTRO_BOXSET))))
- || ((t1 == TechConstants.T_TW_ALL)
- && ((t2 <= TechConstants.T_IS_TW_NON_BOX)
- || (t2 <= TechConstants.T_INTRO_BOXSET)
- || (t2 <= TechConstants.T_CLAN_TW)))
- || ((t1 == TechConstants.T_ALL_IS)
- && ((t2 <= TechConstants.T_IS_TW_NON_BOX)
- || (t2 == TechConstants.T_INTRO_BOXSET)
- || (t2 == TechConstants.T_IS_ADVANCED)
- || (t2 == TechConstants.T_IS_EXPERIMENTAL)
- || (t2 == TechConstants.T_IS_UNOFFICIAL)))
- || ((t1 == TechConstants.T_ALL_CLAN)
- && ((t2 == TechConstants.T_CLAN_TW)
- || (t2 == TechConstants.T_CLAN_ADVANCED)
- || (t2 == TechConstants.T_CLAN_EXPERIMENTAL)
- || (t2 == TechConstants.T_CLAN_UNOFFICIAL)));
- }
-
- private boolean matchTechClass(String t1, String t2) {
- if (t1.equals("All")) {
- return true;
- } else if (t1.equals("IS/Clan")) {
- return t2.equals("Inner Sphere") || t2.equals("Clan") || t1.equals(t2);
- } else {
- return t1.equals(t2);
- }
- }
-
- private boolean matchUnitType(int unitTypeFilter, EquipmentType eq) {
- // All is selected
- if (unitTypeFilter < 0) {
- return true;
- }
-
- switch (unitTypeFilter) {
- case 5: // UnitType.AERO: the aero index is out of order
- if (eq.hasFlag(WeaponType.F_AERO_WEAPON)
- || eq.hasFlag(MiscType.F_FIGHTER_EQUIPMENT)) {
- return true;
- }
- break;
- case UnitType.BATTLE_ARMOR:
- if (eq.hasFlag(WeaponType.F_BA_WEAPON)
- || eq.hasFlag(MiscType.F_BA_EQUIPMENT)) {
- return true;
- }
- break;
- case UnitType.INFANTRY:
- if (eq.hasFlag(WeaponType.F_INFANTRY)) {
- return true;
- }
- break;
- case UnitType.MEK:
- if (eq.hasFlag(WeaponType.F_MEK_WEAPON)
- || eq.hasFlag(MiscType.F_MEK_EQUIPMENT)) {
- return true;
- }
- break;
- case UnitType.TANK:
- if (eq.hasFlag(WeaponType.F_TANK_WEAPON)
- || eq.hasFlag(MiscType.F_TANK_EQUIPMENT)) {
- return true;
- }
- break;
- case UnitType.PROTOMEK:
- if (eq.hasFlag(WeaponType.F_PROTO_WEAPON)
- || eq.hasFlag(MiscType.F_PROTOMEK_EQUIPMENT)) {
- return true;
- }
- break;
- default:
- return false;
- }
- return false;
- }
-
- void filterTables() {
- RowFilter weaponFilter;
- RowFilter equipmentFilter;
- final int techLevel = cboTechLevel.getSelectedIndex();
- final String techClass = (String) cboTechClass.getSelectedItem();
- final int unitType = cboUnitType.getSelectedIndex() - 1;
- // If current expression doesn't parse, don't update.
- try {
- weaponFilter = new RowFilter<>() {
- @Override
- public boolean include(Entry extends WeaponsTableModel, ? extends Integer> entry) {
- WeaponsTableModel weapModel = entry.getModel();
- WeaponType wp = weapModel.getWeaponTypeAt(entry.getIdentifier());
- String currTechClass = TechConstants.getTechName(wp.getTechLevel(gameYear));
-
- boolean techLvlMatch = matchTechLvl(techLevel, wp.getTechLevel(gameYear));
- boolean techClassMatch = matchTechClass(techClass, currTechClass);
- boolean unitTypeMatch = matchUnitType(unitType, wp);
- return techLvlMatch && techClassMatch && unitTypeMatch;
- }
- };
- } catch (java.util.regex.PatternSyntaxException e) {
- return;
- }
- weaponsSorter.setRowFilter(weaponFilter);
-
- try {
- equipmentFilter = new RowFilter<>() {
- @Override
- public boolean include(Entry extends EquipmentTableModel, ? extends Integer> entry) {
- EquipmentTableModel eqModel = entry.getModel();
- EquipmentType eq = eqModel.getEquipmentTypeAt(entry.getIdentifier());
- String currTechClass = TechConstants.getTechName(eq.getTechLevel(gameYear));
- boolean techLvlMatch = matchTechLvl(techLevel, eq.getTechLevel(gameYear));
- boolean techClassMatch = matchTechClass(techClass, currTechClass);
- boolean unitTypeMatch = matchUnitType(unitType, eq);
- return techLvlMatch && techClassMatch && unitTypeMatch;
- }
- };
- } catch (java.util.regex.PatternSyntaxException e) {
- return;
- }
- equipmentSorter.setRowFilter(equipmentFilter);
- }
-
- private String filterExpressionString() {
- // Build the string representation of the new expression
- StringBuilder filterExp = new StringBuilder();
- for (int i = 0; i < filterToks.size(); i++) {
- filterExp.append(" ").append(filterToks.elementAt(i).toString()).append(" ");
- }
- return filterExp.toString();
- }
-
- /**
- * Show the dialog. setVisible(true) blocks until setVisible(false).
- *
- * @return Return the filter that was created with this dialog.
- */
- public MekSearchFilter showDialog() {
- // We need to save a copy since the user can alter the filter state
- // and then click on the cancel button. We want to make sure the
- // original filter state is saved.
- MekSearchFilter currFilter = mekFilter;
- mekFilter = new MekSearchFilter(currFilter);
- txtEqExp.setText(mekFilter.getEquipmentExpression());
- if ((filterToks == null) || filterToks.isEmpty()
- || (filterToks.lastElement() instanceof TWAdvancedSearchPanel.OperationFT)) {
- disableOperationButtons();
- enableSelectionButtons();
- } else {
- enableOperationButtons();
- disableSelectionButtons();
- }
- setVisible(true);
- if (isCanceled) {
- mekFilter = currFilter;
- } else {
- updateMekSearchFilter();
- }
-
- return mekFilter;
- }
-
- /**
- * Clear the filter.
- */
- public void clearValues() {
- tStartWalk.setText("");
- tEndWalk.setText("");
- tStartJump.setText("");
- tEndJump.setText("");
- cArmor.setSelectedIndex(0);
- tblWeapons.clearSelection();
- tblEquipment.clearSelection();
- txtEqExp.setText("");
- mekFilter = null;
- filterToks.clear();
- btnBack.setEnabled(false);
-
- DefaultListModel dlmwa = new DefaultListModel<>();
- ListModel m = listArmorType.getModel();
-
- for (int i = 0; i < m.getSize(); i++) {
- String ms = m.getElementAt(i);
- dlmwa.addElement("\u2610 " + ms.substring(2, ms.length()));
- }
-
- listArmorType.setModel(dlmwa);
-
- m = listCockpitType.getModel();
-
- DefaultListModel dlmc = new DefaultListModel<>();
-
- for (int i = 0; i < m.getSize(); i++) {
- String ms = m.getElementAt(i);
- dlmc.addElement("\u2610 " + ms.substring(2, ms.length()));
- }
-
- listCockpitType.setModel(dlmc);
-
- m = listInternalsType.getModel();
-
- DefaultListModel dlmi = new DefaultListModel<>();
-
- for (int i = 0; i < m.getSize(); i++) {
- String ms = m.getElementAt(i);
- dlmi.addElement("\u2610 " + ms.substring(2, ms.length()));
- }
-
- listInternalsType.setModel(dlmi);
-
- disableOperationButtons();
- enableSelectionButtons();
- }
-
- /**
- * Creates collections for all the possible WeaponType
s and
- * EquipmentType
s. These are used to populate the weapons
- * and equipment tables.
- */
- private void populateWeaponsAndEquipmentChoices() {
- Vector weapons = new Vector<>();
- Vector equipment = new Vector<>();
-
- for (Enumeration e = EquipmentType.getAllTypes(); e.hasMoreElements();) {
- EquipmentType et = e.nextElement();
- if ((et instanceof WeaponType)) {
- weapons.add((WeaponType) et);
- // Check for C3+Tag and C3 Master Booster
- if (et.hasFlag(WeaponType.F_C3M) || et.hasFlag(WeaponType.F_C3MBS)) {
- equipment.add(et);
- }
- }
- if ((et instanceof MiscType)) {
- equipment.add(et);
- }
- }
- weaponsModel.setData(weapons);
- equipmentModel.setData(equipment);
- }
-
- public MekSearchFilter getMekSearchFilter() {
- return mekFilter;
- }
-
- /**
- * Update the search fields that aren't automatically updated.
- */
- protected void updateMekSearchFilter() {
- mekFilter.isDisabled = false;
- mekFilter.sStartWalk = tStartWalk.getText();
- mekFilter.sEndWalk = tEndWalk.getText();
-
- mekFilter.sStartJump = tStartJump.getText();
- mekFilter.sEndJump = tEndJump.getText();
-
- mekFilter.iArmor = cArmor.getSelectedIndex();
-
- mekFilter.sStartYear = tStartYear.getText();
- mekFilter.sEndYear = tEndYear.getText();
-
- ListModel m = listArmorType.getModel();
-
- for (int i = 0; i < m.getSize(); i++) {
- String ms = m.getElementAt(i);
- if (ms.contains("\u2611")) {
- mekFilter.armorType.add(i);
- } else if (ms.contains("\u2612")) {
- mekFilter.armorTypeExclude.add(i);
- }
- }
-
- m = listCockpitType.getModel();
-
- for (int i = 0; i < m.getSize(); i++) {
- String ms = m.getElementAt(i);
- if (ms.contains("\u2611")) {
- mekFilter.cockpitType.add(i);
- } else if (ms.contains("\u2612")) {
- mekFilter.cockpitTypeExclude.add(i);
- }
- }
-
- m = listInternalsType.getModel();
-
- for (int i = 0; i < m.getSize(); i++) {
- String ms = m.getElementAt(i);
- if (ms.contains("\u2611")) {
- mekFilter.internalsType.add(i);
- } else if (ms.contains("\u2612")) {
- mekFilter.internalsTypeExclude.add(i);
- }
- }
- }
-
- /**
- * A table model for displaying weapons
- */
- public class WeaponsTableModel extends AbstractTableModel {
- private static final long serialVersionUID = 1L;
-
- private static final int COL_QTY = 0;
- private static final int COL_NAME = 1;
- private static final int COL_DMG = 2;
- private static final int COL_HEAT = 3;
- private static final int COL_SHORT = 4;
- private static final int COL_MED = 5;
- private static final int COL_LONG = 6;
- private static final int COL_IS_CLAN = 7;
- private static final int COL_LEVEL = 8;
- private static final int N_COL = 9;
- private static final int COL_INTERNAL_NAME = 9;
-
- private int[] qty;
-
- private Vector weapons = new Vector<>();
-
- @Override
- public int getRowCount() {
- return weapons.size();
- }
-
- @Override
- public int getColumnCount() {
- return N_COL;
- }
-
- public int getPreferredWidth(int col) {
- switch (col) {
- case COL_QTY:
- return 40;
- case COL_NAME:
- return 310;
- case COL_IS_CLAN:
- return 75;
- case COL_DMG:
- return 50;
- case COL_HEAT:
- return 50;
- case COL_SHORT:
- return 50;
- case COL_MED:
- return 50;
- case COL_LONG:
- return 50;
- case COL_LEVEL:
- return 100;
- default:
- return 0;
- }
- }
-
- @Override
- public String getColumnName(int column) {
- switch (column) {
- case COL_QTY:
- return "Qty";
- case COL_NAME:
- return "Weapon Name";
- case COL_IS_CLAN:
- return "IS/Clan";
- case COL_DMG:
- return "DMG";
- case COL_HEAT:
- return "Heat";
- case COL_SHORT:
- return "Short";
- case COL_MED:
- return "Med";
- case COL_LONG:
- return "Long";
- case COL_LEVEL:
- return "Lvl";
- default:
- return "?";
- }
- }
-
- @Override
- public Class> getColumnClass(int c) {
- return getValueAt(0, c).getClass();
- }
-
- @Override
- public boolean isCellEditable(int row, int col) {
- switch (col) {
- case COL_QTY:
- return true;
- default:
- return false;
- }
- }
-
- // fill table with values
- public void setData(Vector wps) {
- weapons = wps;
- qty = new int[wps.size()];
- Arrays.fill(qty, 1);
- fireTableDataChanged();
- }
-
- public WeaponType getWeaponTypeAt(int row) {
- return weapons.elementAt(row);
- }
-
- @Override
- public Object getValueAt(int row, int col) {
- if (row >= weapons.size()) {
- return null;
- }
- WeaponType wp = weapons.elementAt(row);
- switch (col) {
- case COL_QTY:
- return qty[row] + "";
- case COL_NAME:
- return wp.getName();
- case COL_IS_CLAN:
- return TechConstants.getTechName(wp.getTechLevel(gameYear));
- case COL_DMG:
- return wp.getDamage();
- case COL_HEAT:
- return wp.getHeat();
- case COL_SHORT:
- return wp.getShortRange();
- case COL_MED:
- return wp.getMediumRange();
- case COL_LONG:
- return wp.getLongRange();
- case COL_LEVEL:
- return TechConstants.getSimpleLevelName(TechConstants
- .convertFromNormalToSimple(wp
- .getTechLevel(gameYear)));
- case COL_INTERNAL_NAME:
- return wp.getInternalName();
- default:
- return "?";
- }
- }
-
- @Override
- public void setValueAt(Object value, int row, int col) {
- switch (col) {
- case COL_QTY:
- qty[row] = Integer.parseInt((String) value);
- fireTableCellUpdated(row, col);
- break;
- default:
- break;
- }
- }
-
- }
-
- /**
- * A table model for displaying weapon types
- */
-
- /**
- * A table model for displaying equipment
- */
- public class EquipmentTableModel extends AbstractTableModel {
- private static final long serialVersionUID = 1L;
-
- private static final int COL_QTY = 0;
- private static final int COL_NAME = 1;
- private static final int COL_COST = 2;
- private static final int COL_IS_CLAN = 3;
- private static final int COL_LEVEL = 4;
- private static final int N_COL = 5;
- private static final int COL_INTERNAL_NAME = 5;
-
- private int[] qty;
- private Vector equipment = new Vector<>();
-
- @Override
- public int getRowCount() {
- return equipment.size();
- }
-
- @Override
- public int getColumnCount() {
- return N_COL;
- }
-
- public int getPreferredWidth(int column) {
- switch (column) {
- case COL_QTY:
- return 40;
- case COL_NAME:
- return 400;
- case COL_IS_CLAN:
- return 75;
- case COL_COST:
- return 175;
- case COL_LEVEL:
- return 100;
- default:
- return 0;
- }
- }
-
- @Override
- public String getColumnName(int column) {
- switch (column) {
- case COL_QTY:
- return "Qty";
- case COL_NAME:
- return "Name";
- case COL_IS_CLAN:
- return "IS/Clan";
- case COL_COST:
- return "Cost";
- case COL_LEVEL:
- return "Lvl";
- default:
- return "?";
- }
- }
-
- @Override
- public Class> getColumnClass(int c) {
- return getValueAt(0, c).getClass();
- }
-
- @Override
- public boolean isCellEditable(int row, int col) {
- switch (col) {
- case COL_QTY:
- return true;
- default:
- return false;
- }
- }
-
- // fill table with values
- public void setData(Vector eq) {
- equipment = eq;
- qty = new int[eq.size()];
- Arrays.fill(qty, 1);
- fireTableDataChanged();
- }
-
- public EquipmentType getEquipmentTypeAt(int row) {
- return equipment.elementAt(row);
- }
-
- @Override
- public Object getValueAt(int row, int col) {
- if (row >= equipment.size()) {
- return null;
- }
- EquipmentType eq = equipment.elementAt(row);
- switch (col) {
- case COL_QTY:
- return qty[row] + "";
- case COL_NAME:
- return eq.getName();
- case COL_IS_CLAN:
- return TechConstants.getTechName(eq.getTechLevel(gameYear));
- case COL_COST:
- return eq.getRawCost();
- case COL_LEVEL:
- return TechConstants.getSimpleLevelName(TechConstants
- .convertFromNormalToSimple(eq
- .getTechLevel(gameYear)));
- case COL_INTERNAL_NAME:
- return eq.getInternalName();
- default:
- return "?";
- }
- }
-
- @Override
- public void setValueAt(Object value, int row, int col) {
- switch (col) {
- case COL_QTY:
- qty[row] = Integer.parseInt((String) value);
- fireTableCellUpdated(row, col);
- break;
- default:
- break;
- }
- }
- }
-
- @Override
- public void keyPressed(KeyEvent evt) {
-
- }
-
- @Override
- public void keyReleased(KeyEvent evt) {
-
- }
-
- @Override
- public void keyTyped(KeyEvent evt) {
- char keyChar = evt.getKeyChar();
- // Ensure we've got a number or letter pressed
- if (!(((keyChar >= '0') && (keyChar <= '9')) ||
- ((keyChar >= 'a') && (keyChar <= 'z')) || (keyChar == ' '))) {
- return;
- }
-
- if (evt.getComponent().equals(tblWeapons)) {
- tblWeapons.keyTyped(evt);
- } else if (evt.getComponent().equals(tblEquipment)) {
- tblEquipment.keyTyped(evt);
- }
- }
-
- /**
- * Base class for different tokens that can be in a filter expression.
- *
- * @author Arlith
- */
- public class FilterTokens {
-
- }
-
- /**
- * FilterTokens subclass that represents parenthesis.
- *
- * @author Arlith
- */
- public class ParensFT extends FilterTokens {
- public String parens;
-
- public ParensFT(String p) {
- parens = p;
- }
-
- @Override
- public String toString() {
- return parens;
- }
- }
-
- /**
- * FilterTokens subclass that represents equipment.
- *
- * @author Arlith
- */
- public class EquipmentFT extends FilterTokens {
- public String internalName;
- public String fullName;
- public int qty;
-
- public EquipmentFT(String in, String fn, int q) {
- internalName = in;
- fullName = fn;
- qty = q;
- }
-
- @Override
- public String toString() {
- if (qty == 1) {
- return qty + " " + fullName;
- } else {
- return qty + " " + fullName + "s";
- }
- }
- }
-
- /**
- * FilterTokens subclass that represents a boolean operation.
- *
- * @author Arlith
- *
- */
- public class OperationFT extends FilterTokens {
- public MekSearchFilter.BoolOp op;
-
- public OperationFT(MekSearchFilter.BoolOp o) {
- op = o;
- }
-
- @Override
- public String toString() {
- if (op == MekSearchFilter.BoolOp.AND) {
- return "And";
- } else if (op == MekSearchFilter.BoolOp.OR) {
- return "Or";
- } else {
- return "";
- }
- }
- }
-}
diff --git a/megamek/src/megamek/client/ui/swing/RandomArmyDialog.java b/megamek/src/megamek/client/ui/swing/RandomArmyDialog.java
index a4d17751c9..d2fdda1bc7 100644
--- a/megamek/src/megamek/client/ui/swing/RandomArmyDialog.java
+++ b/megamek/src/megamek/client/ui/swing/RandomArmyDialog.java
@@ -65,7 +65,7 @@
import megamek.client.ratgenerator.UnitTable;
import megamek.client.ratgenerator.UnitTable.Parameters;
import megamek.client.ui.Messages;
-import megamek.client.ui.swing.dialog.AdvancedSearchDialog2;
+import megamek.client.ui.advancedsearch.AdvancedSearchDialog2;
import megamek.client.ui.swing.lobby.LobbyUtility;
import megamek.client.ui.swing.util.ScalingPopup;
import megamek.client.ui.swing.util.UIUtil;
diff --git a/megamek/src/megamek/client/ui/swing/dialog/AbstractUnitSelectorDialog.java b/megamek/src/megamek/client/ui/swing/dialog/AbstractUnitSelectorDialog.java
index df24d61242..52dab9a268 100644
--- a/megamek/src/megamek/client/ui/swing/dialog/AbstractUnitSelectorDialog.java
+++ b/megamek/src/megamek/client/ui/swing/dialog/AbstractUnitSelectorDialog.java
@@ -44,6 +44,7 @@
import megamek.MegaMek;
import megamek.client.ui.Messages;
+import megamek.client.ui.advancedsearch.AdvancedSearchDialog2;
import megamek.client.ui.dialogs.BVDisplayDialog;
import megamek.client.ui.models.XTableColumnModel;
import megamek.client.ui.panes.EntityViewPane;
diff --git a/megamek/src/megamek/client/ui/swing/unitSelector/TWAdvancedSearchPanel.java b/megamek/src/megamek/client/ui/swing/unitSelector/TWAdvancedSearchPanel.java
deleted file mode 100644
index fbfe5307a2..0000000000
--- a/megamek/src/megamek/client/ui/swing/unitSelector/TWAdvancedSearchPanel.java
+++ /dev/null
@@ -1,3137 +0,0 @@
-/*
- * Copyright (c) 2002, 2003 Ben Mazur (bmazur@sev.org)
- * Copyright (c) 2022 - The MegaMek Team. All Rights Reserved.
- *
- * This file is part of MegaMek.
- *
- * MegaMek is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * MegaMek is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with MegaMek. If not, see .
- */
-package megamek.client.ui.swing.unitSelector;
-
-import java.awt.BorderLayout;
-import java.awt.Dimension;
-import java.awt.FlowLayout;
-import java.awt.Font;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.event.ActionListener;
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
-import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-import java.util.stream.Collectors;
-
-import javax.swing.*;
-import javax.swing.border.Border;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
-import javax.swing.table.AbstractTableModel;
-import javax.swing.table.TableColumn;
-import javax.swing.table.TableRowSorter;
-
-import megamek.MMConstants;
-import megamek.client.ui.Messages;
-import megamek.client.ui.swing.table.MegaMekTable;
-import megamek.client.ui.swing.util.UIUtil;
-import megamek.common.*;
-import megamek.common.equipment.ArmorType;
-import megamek.common.options.AbstractOptions;
-import megamek.common.options.IOption;
-import megamek.common.options.IOptionGroup;
-import megamek.common.options.Quirks;
-import megamek.common.options.WeaponQuirks;
-
-/**
- * Panel that allows the user to create a unit filter.
- *
- * @author Arlith
- * @author Jay Lawson
- * @author Simon (Juliez)
- */
-public class TWAdvancedSearchPanel extends JPanel implements ActionListener, ItemListener,
- KeyListener, ListSelectionListener {
-
- private boolean isCanceled = true;
- public MekSearchFilter mekFilter;
- private Vector filterToks;
-
- // Weapons / Equipment
- private JButton btnWELeftParen = new JButton("(");
- private JButton btnWERightParen = new JButton(")");
- private JButton btnWEAdd = new JButton(Messages.getString("MekSelectorDialog.Search.add"));
- private JButton btnWEAnd = new JButton(Messages.getString("MekSelectorDialog.Search.and"));
- private JButton btnWEOr = new JButton(Messages.getString("MekSelectorDialog.Search.or"));
- private JButton btnWEClear = new JButton(Messages.getString("MekSelectorDialog.Reset"));
- private JButton btnWEBack = new JButton("Back");
- private JLabel lblWEEqExpTxt = new JLabel(Messages.getString("MekSelectorDialog.Search.FilterExpression"));
- private JTextArea txtWEEqExp = new JTextArea("");
- private JScrollPane expWEScroller = new JScrollPane(txtWEEqExp,
- JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
- JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
- private JLabel lblUnitType = new JLabel(Messages.getString("MekSelectorDialog.Search.UnitType"));
- private JLabel lblTechClass = new JLabel(Messages.getString("MekSelectorDialog.Search.TechClass"));
- private JLabel lblTechLevelBase = new JLabel(Messages.getString("MekSelectorDialog.Search.TechLevel"));
- private JComboBox cboUnitType = new JComboBox<>();
- private JComboBox cboTechClass = new JComboBox<>();
- private JComboBox cboTechLevel = new JComboBox<>();
- private JLabel lblWeaponClass = new JLabel(Messages.getString("MekSelectorDialog.Search.WeaponClass"));
- private JScrollPane scrTableWeaponType = new JScrollPane();
- private MegaMekTable tblWeaponType;
- private WeaponClassTableModel weaponTypesModel;
- private TableRowSorter weaponTypesSorter;
- private JLabel lblWeapons = new JLabel(Messages.getString("MekSelectorDialog.Search.Weapons"));
- private JScrollPane scrTableWeapons = new JScrollPane();
- private MegaMekTable tblWeapons;
- private WeaponsTableModel weaponsModel;
- private TableRowSorter weaponsSorter;
- private JLabel lblEquipment = new JLabel(Messages.getString("MekSelectorDialog.Search.Equipment"));
- private JScrollPane scrTableEquipment = new JScrollPane();
- private MegaMekTable tblEquipment;
- private EquipmentTableModel equipmentModel;
- private TableRowSorter equipmentSorter;
- private JComboBox cboQty = new JComboBox<>();
-
- // Base
- private JButton btnBaseClear = new JButton(Messages.getString("MekSelectorDialog.ClearTab"));
- private JLabel lblWalk = new JLabel(Messages.getString("MekSelectorDialog.Search.Walk"));
- private JTextField tStartWalk = new JTextField(4);
- private JTextField tEndWalk = new JTextField(4);
- private JLabel lblJump = new JLabel(Messages.getString("MekSelectorDialog.Search.Jump"));
- private JTextField tStartJump = new JTextField(4);
- private JTextField tEndJump = new JTextField(4);
- private JLabel lblTankTurrets = new JLabel(Messages.getString("MekSelectorDialog.Search.TankTurrets"));
- private JTextField tStartTankTurrets = new JTextField(4);
- private JTextField tEndTankTurrets= new JTextField(4);
- private JLabel lblLowerArms = new JLabel(Messages.getString("MekSelectorDialog.Search.LowerArms"));
- private JTextField tStartLowerArms = new JTextField(4);
- private JTextField tEndLowerArms = new JTextField(4);
- private JLabel lblHands = new JLabel(Messages.getString("MekSelectorDialog.Search.Hands"));
- private JTextField tStartHands = new JTextField(4);
- private JTextField tEndHands = new JTextField(4);
- private JLabel lblArmor = new JLabel(Messages.getString("MekSelectorDialog.Search.Armor"));
- private JComboBox cArmor = new JComboBox<>();
- private JLabel lblOfficial = new JLabel(Messages.getString("MekSelectorDialog.Search.Official"));
- private JComboBox cOfficial = new JComboBox<>();
- private JLabel lblCanon = new JLabel(Messages.getString("MekSelectorDialog.Search.Canon"));
- private JComboBox cCanon = new JComboBox<>();
- private JLabel lblPatchwork = new JLabel(Messages.getString("MekSelectorDialog.Search.Patchwork"));
- private JComboBox cPatchwork = new JComboBox<>();
- private JLabel lblInvalid = new JLabel(Messages.getString("MekSelectorDialog.Search.Invalid"));
- private JComboBox cInvalid = new JComboBox<>();
- private JLabel lblFailedToLoadEquipment = new JLabel(Messages.getString("MekSelectorDialog.Search.FailedToLoadEquipment"));
- private JComboBox cFailedToLoadEquipment = new JComboBox<>();
- private JLabel lblClanEngine = new JLabel(Messages.getString("MekSelectorDialog.Search.ClanEngine"));
- private JComboBox cClanEngine = new JComboBox<>();
- private JLabel lblTableFilters = new JLabel(Messages.getString("MekSelectorDialog.Search.TableFilters"));
- private JLabel lblSource = new JLabel(Messages.getString("MekSelectorDialog.Search.Source"));
- private JTextField tSource = new JTextField(4);
- private JLabel lblMULId = new JLabel(Messages.getString("MekSelectorDialog.Search.MULId"));
- private JTextField tMULId = new JTextField(4);
- private JLabel lblYear = new JLabel(Messages.getString("MekSelectorDialog.Search.Year"));
- private JTextField tStartYear = new JTextField(4);
- private JTextField tEndYear = new JTextField(4);
- private JLabel lblTons = new JLabel(Messages.getString("MekSelectorDialog.Search.Tons"));
- private JTextField tStartTons = new JTextField(4);
- private JTextField tEndTons = new JTextField(4);
- private JLabel lblBV = new JLabel(Messages.getString("MekSelectorDialog.Search.BV"));
- private JTextField tStartBV = new JTextField(4);
- private JTextField tEndBV = new JTextField(4);
- private JLabel lblCockpitType = new JLabel(Messages.getString("MekSelectorDialog.Search.CockpitType"));
- private JList listCockpitType = new JList<>(new DefaultListModel());
- private JScrollPane spCockpitType = new JScrollPane(listCockpitType);
- private JLabel lblArmorType = new JLabel(Messages.getString("MekSelectorDialog.Search.ArmorType"));
- private JList listArmorType = new JList<>(new DefaultListModel());
- private JScrollPane spArmorType = new JScrollPane(listArmorType);
- private JLabel lblInternalsType = new JLabel(Messages.getString("MekSelectorDialog.Search.InternalsType"));
- private JList listInternalsType = new JList<>(new DefaultListModel());
- private JScrollPane spInternalsType = new JScrollPane(listInternalsType);
- private JLabel lblEngineType = new JLabel(Messages.getString("MekSelectorDialog.Search.Engine"));
- private JList listEngineType = new JList<>(new DefaultListModel());
- private JScrollPane spEngineType = new JScrollPane(listEngineType);
- private JLabel lblGyroType = new JLabel(Messages.getString("MekSelectorDialog.Search.Gyro"));
- private JList listGyroType = new JList<>(new DefaultListModel());
- private JScrollPane spGyroType = new JScrollPane(listGyroType);
- private JLabel lblTechLevel = new JLabel(Messages.getString("MekSelectorDialog.Search.TechLevel"));
- private JList listTechLevel = new JList<>(new DefaultListModel());
- private JScrollPane spTechLevel = new JScrollPane(listTechLevel);
- private JLabel lblTechBase = new JLabel(Messages.getString("MekSelectorDialog.Search.TechBase"));
- private JList listTechBase = new JList<>(new DefaultListModel());
- private JScrollPane spTechBase = new JScrollPane(listTechBase);
-
- // Transports
- private JButton btnTransportsClear = new JButton(Messages.getString("MekSelectorDialog.ClearTab"));
- private JLabel lblTroopSpace = new JLabel(Messages.getString("MekSelectorDialog.Search.TroopSpace"));
- private JTextField tStartTroopSpace = new JTextField(4);
- private JTextField tEndTroopSpace = new JTextField(4);
- private JLabel lblASFBays = new JLabel(Messages.getString("MekSelectorDialog.Search.ASFBays"));
- private JTextField tStartASFBays = new JTextField(4);
- private JTextField tEndASFBays = new JTextField(4);
- private JLabel lblASFDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
- private JTextField tStartASFDoors = new JTextField(4);
- private JTextField tEndASFDoors = new JTextField(4);
- private JLabel lblASFUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
- private JTextField tStartASFUnits = new JTextField(4);
- private JTextField tEndASFUnits = new JTextField(4);
- private JLabel lblSmallCraftBays = new JLabel(Messages.getString("MekSelectorDialog.Search.SmallCraftBays"));
- private JTextField tStartSmallCraftBays = new JTextField(4);
- private JTextField tEndSmallCraftBays = new JTextField(4);
- private JLabel lblSmallCraftDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
- private JTextField tStartSmallCraftDoors = new JTextField(4);
- private JTextField tEndSmallCraftDoors = new JTextField(4);
- private JLabel lblSmallCraftUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
- private JTextField tStartSmallCraftUnits = new JTextField(4);
- private JTextField tEndSmallCraftUnits = new JTextField(4);
- private JLabel lblMekBays = new JLabel(Messages.getString("MekSelectorDialog.Search.MekBays"));
- private JTextField tStartMekBays = new JTextField(4);
- private JTextField tEndMekBays = new JTextField(4);
- private JLabel lblMekDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
- private JTextField tStartMekDoors = new JTextField(4);
- private JTextField tEndMekDoors = new JTextField(4);
- private JLabel lblMekUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
- private JTextField tStartMekUnits = new JTextField(4);
- private JTextField tEndMekUnits = new JTextField(4);
- private JLabel lblHeavyVehicleBays = new JLabel(Messages.getString("MekSelectorDialog.Search.HeavyVehicleBays"));
- private JTextField tStartHeavyVehicleBays = new JTextField(4);
- private JTextField tEndHeavyVehicleBays = new JTextField(4);
- private JLabel lblHeavyVehicleDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
- private JTextField tStartHeavyVehicleDoors = new JTextField(4);
- private JTextField tEndHeavyVehicleDoors = new JTextField(4);
- private JLabel lblHeavyVehicleUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
- private JTextField tStartHeavyVehicleUnits = new JTextField(4);
- private JTextField tEndHeavyVehicleUnits = new JTextField(4);
- private JLabel lblLightVehicleBays = new JLabel(Messages.getString("MekSelectorDialog.Search.LightVehicleBays"));
- private JTextField tStartLightVehicleBays = new JTextField(4);
- private JTextField tEndLightVehicleBays = new JTextField(4);
- private JLabel lblLightVehicleDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
- private JTextField tStartLightVehicleDoors = new JTextField(4);
- private JTextField tEndLightVehicleDoors = new JTextField(4);
- private JLabel lblLightVehicleUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
- private JTextField tStartLightVehicleUnits = new JTextField(4);
- private JTextField tEndLightVehicleUnits = new JTextField(4);
- private JLabel lblProtomekBays = new JLabel(Messages.getString("MekSelectorDialog.Search.ProtomekBays"));
- private JTextField tStartProtomekBays = new JTextField(4);
- private JTextField tEndProtomekBays = new JTextField(4);
- private JLabel lblProtomekDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
- private JTextField tStartProtomekDoors = new JTextField(4);
- private JTextField tEndProtomekDoors = new JTextField(4);
- private JLabel lblProtomekUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
- private JTextField tStartProtomekUnits = new JTextField(4);
- private JTextField tEndProtomekUnits = new JTextField(4);
- private JLabel lblBattleArmorBays = new JLabel(Messages.getString("MekSelectorDialog.Search.BattleArmorBays"));
- private JTextField tStartBattleArmorBays = new JTextField(4);
- private JTextField tEndBattleArmorBays = new JTextField(4);
- private JLabel lblBattleArmorDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
- private JTextField tStartBattleArmorDoors = new JTextField(4);
- private JTextField tEndBattleArmorDoors = new JTextField(4);
- private JLabel lblBattleArmorUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
- private JTextField tStartBattleArmorUnits = new JTextField(4);
- private JTextField tEndBattleArmorUnits = new JTextField(4);
- private JLabel lblInfantryBays = new JLabel(Messages.getString("MekSelectorDialog.Search.InfantryBays"));
- private JTextField tStartInfantryBays = new JTextField(4);
- private JTextField tEndInfantryBays = new JTextField(4);
- private JLabel lblInfantryDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
- private JTextField tStartInfantryDoors = new JTextField(4);
- private JTextField tEndInfantryDoors = new JTextField(4);
- private JLabel lblInfantryUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
- private JTextField tStartInfantryUnits = new JTextField(4);
- private JTextField tEndInfantryUnits = new JTextField(4);
- private JLabel lblSuperHeavyVehicleBays = new JLabel(Messages.getString("MekSelectorDialog.Search.SuperHeavyVehicleBays"));
- private JTextField tStartSuperHeavyVehicleBays = new JTextField(4);
- private JTextField tEndSuperHeavyVehicleBays = new JTextField(4);
- private JLabel lblSuperHeavyVehicleDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
- private JTextField tStartSuperHeavyVehicleDoors = new JTextField(4);
- private JTextField tEndSuperHeavyVehicleDoors = new JTextField(4);
- private JLabel lblSuperHeavyVehicleUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
- private JTextField tStartSuperHeavyVehicleUnits = new JTextField(4);
- private JTextField tEndSuperHeavyVehicleUnits = new JTextField(4);
- private JLabel lblDropshuttleBays = new JLabel(Messages.getString("MekSelectorDialog.Search.DropshuttleBays"));
- private JTextField tStartDropshuttleBays = new JTextField(4);
- private JTextField tEndDropshuttleBays = new JTextField(4);
- private JLabel lblDropshuttleDoors = new JLabel(Messages.getString("MekSelectorDialog.Search.Doors"));
- private JTextField tStartDropshuttleDoors = new JTextField(4);
- private JTextField tEndDropshuttleDoors = new JTextField(4);
- private JLabel lblDropshuttleUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.Units"));
- private JTextField tStartDropshuttleUnits = new JTextField(4);
- private JTextField tEndDropshuttleUnits = new JTextField(4);
- private JLabel lblDockingCollars = new JLabel(Messages.getString("MekSelectorDialog.Search.DockingCollars"));
- private JTextField tStartDockingCollars = new JTextField(4);
- private JTextField tEndDockingCollars = new JTextField(4);
- private JLabel lblBattleArmorHandles = new JLabel(Messages.getString("MekSelectorDialog.Search.BattleArmorHandles"));
- private JTextField tStartBattleArmorHandles = new JTextField(4);
- private JTextField tEndBattleArmorHandles = new JTextField(4);
- private JLabel lblCargoBayUnits = new JLabel(Messages.getString("MekSelectorDialog.Search.CargoBayUnits"));
- private JTextField tStartCargoBayUnits = new JTextField(4);
- private JTextField tEndCargoBayUnits = new JTextField(4);
- private JLabel lblNavalRepairFacilities = new JLabel(Messages.getString("MekSelectorDialog.Search.NavalRepairFacilities"));
- private JTextField tStartNavalRepairFacilities = new JTextField(4);
- private JTextField tEndNavalRepairFacilities = new JTextField(4);
-
- // Quirks
- private JButton btnQuirksClear = new JButton(Messages.getString("MekSelectorDialog.ClearTab"));
- private JLabel lblQuirkInclude = new JLabel("\u2611");
- private JComboBox cQuirkInclue = new JComboBox<>();
- private JLabel lblQuirkExclude = new JLabel("\u2612");
- private JComboBox cQuirkExclude = new JComboBox<>();
- private JLabel lblQuirkType = new JLabel(Messages.getString("MekSelectorDialog.Search.Quirk"));
- private JList listQuirkType = new JList<>(new DefaultListModel());
- private JScrollPane spQuirkType = new JScrollPane(listQuirkType);
- private JLabel lblWeaponQuirkInclude = new JLabel("\u2611");
- private JComboBox cWeaponQuirkInclue = new JComboBox<>();
- private JLabel lblWeaponQuirkExclude = new JLabel("\u2612");
- private JComboBox cWeaponQuirkExclude = new JComboBox<>();
- private JLabel lblWeaponQuirkType = new JLabel(Messages.getString("MekSelectorDialog.Search.WeaponQuirk"));
- private JList listWeaponQuirkType = new JList<>(new DefaultListModel());
- private JScrollPane spWeaponQuirkType = new JScrollPane(listWeaponQuirkType);
-
- // Unit Type
- private JButton btnUnitTypeClear = new JButton(Messages.getString("MekSelectorDialog.ClearTab"));
- private JLabel lblFilterMek= new JLabel(Messages.getString("MekSelectorDialog.Search.Mek"));
- private JButton btnFilterMek = new JButton("\u2610");
- private JLabel lblFilterBipedMek= new JLabel(Messages.getString("MekSelectorDialog.Search.BipedMek"));
- private JButton btnFilterBipedMek = new JButton("\u2610");
- private JLabel lblFilterProtoMek= new JLabel(Messages.getString("MekSelectorDialog.Search.ProtoMek"));
- private JButton btnFilterProtoMek = new JButton("\u2610");
- private JLabel lblFilterLAM = new JLabel(Messages.getString("MekSelectorDialog.Search.LAM"));
- private JButton btnFilterLAM = new JButton("\u2610");
- private JLabel lblFilterTripod = new JLabel(Messages.getString("MekSelectorDialog.Search.Tripod"));
- private JButton btnFilterTripod = new JButton("\u2610");
- private JLabel lblFilterQuad = new JLabel(Messages.getString("MekSelectorDialog.Search.Quad"));
- private JButton btnFilterQuad= new JButton("\u2610");
- private JLabel lblFilterQuadVee = new JLabel(Messages.getString("MekSelectorDialog.Search.QuadVee"));
- private JButton btnFilterQuadVee = new JButton("\u2610");
- private JLabel lblFilterAero = new JLabel(Messages.getString("MekSelectorDialog.Search.Aero"));
- private JButton btnFilterAero = new JButton("\u2610");
- private JLabel lblFilterFixedWingSupport = new JLabel(Messages.getString("MekSelectorDialog.Search.FixedWingSupport"));
- private JButton btnFilterFixedWingSupport = new JButton("\u2610");
- private JLabel lblFilterConvFighter = new JLabel(Messages.getString("MekSelectorDialog.Search.ConvFighter"));
- private JButton btnFilterConvFighter = new JButton("\u2610");
- private JLabel lblFilterSmallCraft = new JLabel(Messages.getString("MekSelectorDialog.Search.SmallCraft"));
- private JButton btnFilterSmallCraft = new JButton("\u2610");
- private JLabel lblFilterDropship = new JLabel(Messages.getString("MekSelectorDialog.Search.Dropship"));
- private JButton btnFilterDropship = new JButton("\u2610");
- private JLabel lblFilterJumpship = new JLabel(Messages.getString("MekSelectorDialog.Search.Jumpship"));
- private JButton btnFilterJumpship = new JButton("\u2610");
- private JLabel lblFilterWarship = new JLabel(Messages.getString("MekSelectorDialog.Search.Warship"));
- private JButton btnFilterWarship = new JButton("\u2610");
- private JLabel lblFilterSpaceStation = new JLabel(Messages.getString("MekSelectorDialog.Search.SpaceStation"));
- private JButton btnFilterSpaceStation = new JButton("\u2610");
- private JLabel lblFilterInfantry = new JLabel(Messages.getString("MekSelectorDialog.Search.Infantry"));
- private JButton btnFilterInfantry = new JButton("\u2610");
- private JLabel lblFilterBattleArmor = new JLabel(Messages.getString("MekSelectorDialog.Search.BattleArmor"));
- private JButton btnFilterBattleArmor = new JButton("\u2610");
- private JLabel lblFilterTank = new JLabel(Messages.getString("MekSelectorDialog.Search.Tank"));
- private JButton btnFilterTank = new JButton("\u2610");
- private JLabel lblFilterVTOL = new JLabel(Messages.getString("MekSelectorDialog.Search.VTOL"));
- private JButton btnFilterVTOL = new JButton("\u2610");
- private JLabel lblFilterSupportVTOL = new JLabel(Messages.getString("MekSelectorDialog.Search.SupportVTOL"));
- private JButton btnFilterSupportVTOL = new JButton("\u2610");
- private JLabel lblFilterGunEmplacement = new JLabel(Messages.getString("MekSelectorDialog.Search.GunEmplacement"));
- private JButton btnFilterGunEmplacement = new JButton("\u2610");
- private JLabel lblFilterSupportTank = new JLabel(Messages.getString("MekSelectorDialog.Search.SupportTank"));
- private JButton btnFilterSupportTank= new JButton("\u2610");
- private JLabel lblFilterLargeSupportTank = new JLabel(Messages.getString("MekSelectorDialog.Search.LargeSupportTank"));
- private JButton btnFilterLargeSupportTank= new JButton("\u2610");
- private JLabel lblFilterSuperHeavyTank = new JLabel(Messages.getString("MekSelectorDialog.Search.SuperHeavyTank"));
- private JButton btnFilterSuperHeavyTank = new JButton("\u2610");
- private JLabel lblFilterOmni = new JLabel(Messages.getString("MekSelectorDialog.Search.Omni"));
- private JButton btnFilterOmni = new JButton("\u2610");
- private JLabel lblFilterMilitary = new JLabel(Messages.getString("MekSelectorDialog.Search.Military"));
- private JButton btnFilterMilitary = new JButton("\u2610");
- private JLabel lblFilterIndustrial = new JLabel(Messages.getString("MekSelectorDialog.Search.Industrial"));
- private JButton btnFilterIndustrial = new JButton("\u2610");
- private JLabel lblFilterMountedInfantry = new JLabel(Messages.getString("MekSelectorDialog.Search.MountedInfantry"));
- private JButton btnFilterMountedInfantry = new JButton("\u2610");
- private JLabel lblFilterWaterOnly = new JLabel(Messages.getString("MekSelectorDialog.Search.WaterOnly"));
- private JButton btnFilterWaterOnly = new JButton("\u2610");
- private JLabel lblFilterSupportVehicle = new JLabel(Messages.getString("MekSelectorDialog.Search.SupportVehicle"));
- private JButton btnFilterSupportVehicle = new JButton("\u2610");
- private JLabel lblFilterAerospaceFighter = new JLabel(Messages.getString("MekSelectorDialog.Search.AerospaceFighter"));
- private JButton btnFilterAerospaceFighter = new JButton("\u2610");
- private JLabel lblFilterDoomedOnGround = new JLabel(Messages.getString("MekSelectorDialog.Search.DoomedOnGround"));
- private JButton btnFilterDoomedOnGround = new JButton("\u2610");
- private JLabel lblFilterDoomedInAtmosphere = new JLabel(Messages.getString("MekSelectorDialog.Search.DoomedInAtmosphere"));
- private JButton btnFilterDoomedInAtmosphere = new JButton("\u2610");
- private JLabel lblFilterDoomedInSpace = new JLabel(Messages.getString("MekSelectorDialog.Search.DoomedInSpace"));
- private JButton btnFilterDoomedInSpace = new JButton("\u2610");
- private JLabel lblFilterDoomedInExtremeTemp = new JLabel(Messages.getString("MekSelectorDialog.Search.DoomedInExtremeTemp"));
- private JButton btnFilterDoomedInExtremeTemp = new JButton("\u2610");
- private JLabel lblFilterDoomedInVacuum = new JLabel(Messages.getString("MekSelectorDialog.Search.DoomedInVacuum"));
- private JButton btnFilterDoomedInVacuum = new JButton("\u2610");
-
- /** The game's current year. */
- private int gameYear;
-
- /**
- * Constructs a new advanced search panel for Total Warfare values
- */
- public TWAdvancedSearchPanel(int year) {
- mekFilter = new MekSearchFilter();
- gameYear = year;
- filterToks = new Vector<>(30);
-
- // Layout
- setLayout(new BorderLayout());
-
- JTabbedPane twSearchPane = new JTabbedPane();
-
- JPanel basePanel = createBasePanel();
- JPanel weaponEqPanel = createWeaponEqPanel();
- JPanel unitTypePanel = createUnitTypePanel();
- JPanel quirkPanel = createQuirkPanel();
- JPanel transportsPanel = createTransportsPanel();
-
- String msg_base = Messages.getString("MekSelectorDialog.Search.Base");
- String msg_weaponEq = Messages.getString("MekSelectorDialog.Search.WeaponEq");
- String msg_unitType = Messages.getString("MekSelectorDialog.Search.unitType");
- String msg_quirkType = Messages.getString("MekSelectorDialog.Search.Quirks");
- String msg_transports = Messages.getString("MekSelectorDialog.Search.Transports");
-
- twSearchPane.addTab(msg_unitType, unitTypePanel);
- twSearchPane.addTab(msg_base, basePanel);
- twSearchPane.addTab(msg_weaponEq, weaponEqPanel);
- twSearchPane.addTab(msg_transports, transportsPanel);
- twSearchPane.addTab(msg_quirkType, quirkPanel);
-
- this.add(twSearchPane, BorderLayout.NORTH);
- }
-
- private static class NoSelectionModel extends DefaultListSelectionModel {
- @Override
- public void setAnchorSelectionIndex(final int anchorIndex) {}
-
- @Override
- public void setLeadAnchorNotificationEnabled(final boolean flag) {}
-
- @Override
- public void setLeadSelectionIndex(final int leadIndex) {}
-
- @Override
- public void setSelectionInterval(final int index0, final int index1) {}
- }
-
- private static class TriStateItem {
- public String state;
- public String text;
- public int code;
-
- public TriStateItem(String state, String text) {
- this.state = state;
- this.text = text;
- }
-
- public TriStateItem(String state, int code, String text) {
- this.state = state;
- this.code = code;
- this.text = text;
- }
-
- @Override
- public String toString() {
- return state + " " + text;
- }
- }
-
- private void jListSetup(JList l) {
- l.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- l.setSelectionModel(new NoSelectionModel());
- l.addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- super.mouseClicked(e);
- if (e.getButton() == MouseEvent.BUTTON1) {
- JList list = (JList) e.getSource();
- int index = list.locationToIndex(e.getPoint());
- toggleText(list, index);
- }
- }
- });
- }
-
- private void loadTriStateItem(List s, JList l, int count) {
- DefaultListModel dlma = new DefaultListModel<>();
-
- for (String desc : s) {
- dlma.addElement(new TriStateItem("\u2610", desc));
- }
-
- l.setModel(dlma);
- l.setVisibleRowCount(count);
- jListSetup(l);
- }
-
- private void loadTriStateItem(Map s, JList l, int count) {
- DefaultListModel dlma = new DefaultListModel<>();
-
- for (Map.Entry desc : s.entrySet()) {
- dlma.addElement(new TriStateItem("\u2610", desc.getKey(), desc.getValue()));
- }
-
- l.setModel(dlma);
- l.setVisibleRowCount(count);
- jListSetup(l);
- }
-
- private void loadYesNo(JComboBox cb) {
- cb.addItem(Messages.getString("MekSelectorDialog.Search.Any"));
- cb.addItem(Messages.getString("MekSelectorDialog.Search.Yes"));
- cb.addItem(Messages.getString("MekSelectorDialog.Search.No"));
- }
-
- private JPanel createBaseAttributes() {
- loadYesNo(cOfficial);
- loadYesNo(cCanon);
- loadYesNo(cInvalid);
- loadYesNo(cFailedToLoadEquipment);
-
- JPanel baseAttributesPanel = new JPanel();
- GridBagConstraints c = new GridBagConstraints();
- baseAttributesPanel.setLayout(new GridBagLayout());
-
- c.weighty = 0;
- c.anchor = GridBagConstraints.NORTHWEST;
- c.fill = GridBagConstraints.NONE;
- c.gridwidth = 1;
- c.insets = new Insets(20, 10, 0, 0);
- c.gridx = 0; c.gridy = 0;
-
- JPanel p0Panel = new JPanel();
- p0Panel.add(lblOfficial);
- p0Panel.add(cOfficial);
- p0Panel.add(lblCanon);
- p0Panel.add(cCanon);
- baseAttributesPanel.add(p0Panel, c);
- c.fill = GridBagConstraints.HORIZONTAL;
- c.gridx = 1;
- JPanel sPanel = new JPanel(new BorderLayout());
- sPanel.add(lblSource, BorderLayout.WEST);
- sPanel.add(tSource, BorderLayout.CENTER);
- baseAttributesPanel.add(sPanel, c);
- c.gridx = 2;
- JPanel mPanel = new JPanel(new BorderLayout());
- mPanel.add(lblMULId, BorderLayout.WEST);
- mPanel.add(tMULId, BorderLayout.CENTER);
- baseAttributesPanel.add(mPanel, c);
-
- c.fill = GridBagConstraints.NONE;
- c.insets = new Insets(5, 10, 0, 0);
- c.gridx = 0; c.gridy++;
- JPanel yearPanel = new JPanel();
- yearPanel.add(lblYear);
- yearPanel.add(tStartYear);
- yearPanel.add(new JLabel("-"));
- yearPanel.add(tEndYear);
- baseAttributesPanel.add(yearPanel, c);
- c.gridx = 1;
- JPanel p1bPanel = new JPanel();
- p1bPanel.add(lblFailedToLoadEquipment);
- p1bPanel.add(cFailedToLoadEquipment);
- baseAttributesPanel.add(p1bPanel, c);
- c.gridx = 2;
- JPanel p1cPanel = new JPanel();
- p1cPanel.add(lblInvalid);
- p1cPanel.add(cInvalid);
- baseAttributesPanel.add(p1cPanel, c);
-
- c.gridx = 0; c.gridy++;
- JPanel bvPanel = new JPanel();
- bvPanel.add(lblBV);
- bvPanel.add(tStartBV);
- bvPanel.add(new JLabel("-"));
- bvPanel.add(tEndBV);
- baseAttributesPanel.add(bvPanel, c);
- c.gridx = 1;
- JPanel tonsPanel = new JPanel();
- tonsPanel.add(lblTons);
- tonsPanel.add(tStartTons);
- tonsPanel.add(new JLabel("-"));
- tonsPanel.add(tEndTons);
- baseAttributesPanel.add(tonsPanel, c);
-
- c.gridx = 0; c.gridy++;
- JPanel walkPanel = new JPanel();
- walkPanel.add(lblWalk);
- walkPanel.add(tStartWalk);
- walkPanel.add(new JLabel("-"));
- walkPanel.add(tEndWalk);
- baseAttributesPanel.add(walkPanel, c);
- c.gridx = 1;
- JPanel jumpPanel = new JPanel();
- jumpPanel.add(lblJump);
- jumpPanel.add(tStartJump);
- jumpPanel.add(new JLabel("-"));
- jumpPanel.add(tEndJump);
- baseAttributesPanel.add(jumpPanel, c);
-
- c.gridx = 0; c.gridy++;
- JPanel lowerArmsPanel = new JPanel();
- lowerArmsPanel.add(lblLowerArms);
- lowerArmsPanel.add(tStartLowerArms);
- lowerArmsPanel.add(new JLabel("-"));
- lowerArmsPanel.add(tEndLowerArms);
- baseAttributesPanel.add(lowerArmsPanel, c);
- c.gridx = 1;
- JPanel handsPanel = new JPanel();
- handsPanel.add(lblHands);
- handsPanel.add(tStartHands);
- handsPanel.add(new JLabel("-"));
- handsPanel.add(tEndHands);
- baseAttributesPanel.add(handsPanel, c);
-
- c.gridx = 0; c.gridy++;
- JPanel p2Panel = new JPanel();
- p2Panel.add(lblTankTurrets);
- p2Panel.add(tStartTankTurrets);
- p2Panel.add(new JLabel("-"));
- p2Panel.add(tEndTankTurrets);
- baseAttributesPanel.add(p2Panel, c);
- c.gridx = 1;
- JPanel armorPanel = new JPanel();
- armorPanel.add(lblArmor);
- armorPanel.add(cArmor);
- baseAttributesPanel.add(armorPanel, c);
-
- return baseAttributesPanel;
- }
-
- private JPanel createBaseComboBoxes() {
- cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Any"));
- cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor25"));
- cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor50"));
- cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor75"));
- cArmor.addItem(Messages.getString("MekSelectorDialog.Search.Armor90"));
-
- loadYesNo(cClanEngine);
- loadYesNo(cPatchwork);
-
- loadTriStateItem(ArmorType.getAllArmorCodeName(), listArmorType, 5);
- loadTriStateItem(Mek.getAllCockpitCodeName(), listCockpitType, 7);
- loadTriStateItem(EquipmentType.getAllStructureCodeName(), listInternalsType, 7);
- loadTriStateItem(Engine.getAllEngineCodeName(), listEngineType, 5);
- loadTriStateItem(Entity.getAllGyroCodeName(), listGyroType, 7);
- loadTriStateItem(SimpleTechLevel.getAllSimpleTechLevelCodeName(), listTechLevel, 5);
- loadTriStateItem(Entity.getTechBaseDescriptions(), listTechBase, 4);
-
- JPanel baseComboBoxesPanel = new JPanel();
- GridBagConstraints c = new GridBagConstraints();
- baseComboBoxesPanel.setLayout(new GridBagLayout());
-
- c.weighty = 0;
- c.anchor = GridBagConstraints.NORTHWEST;
- c.fill = GridBagConstraints.NONE;
- c.gridwidth = 1;
- c.insets = new Insets(5, 10, 0, 0);
- c.gridx = 0; c.gridy = 0;
-
- JPanel cockpitPanel = new JPanel(new BorderLayout());
- cockpitPanel.add(lblCockpitType, BorderLayout.NORTH);
- cockpitPanel.add(spCockpitType, BorderLayout.CENTER);
- baseComboBoxesPanel.add(cockpitPanel, c);
- c.gridx = 1;
- JPanel enginePanel = new JPanel(new BorderLayout());
- enginePanel.add(lblEngineType, BorderLayout.NORTH);
- enginePanel.add(spEngineType, BorderLayout.CENTER);
- JPanel clanEnginePanel = new JPanel();
- clanEnginePanel.add(lblClanEngine);
- clanEnginePanel.add(cClanEngine);
- enginePanel.add(clanEnginePanel, BorderLayout.SOUTH);
- baseComboBoxesPanel.add(enginePanel, c);
- c.gridx = 2;
- JPanel gyroPanel = new JPanel(new BorderLayout());
- gyroPanel.add(lblGyroType, BorderLayout.NORTH);
- gyroPanel.add(spGyroType, BorderLayout.CENTER);
- baseComboBoxesPanel.add(gyroPanel, c);
-
- c.gridx = 0; c.gridy++;;
- JPanel armorTypePanel = new JPanel(new BorderLayout());
- armorTypePanel.add(lblArmorType, BorderLayout.NORTH);
- armorTypePanel.add(spArmorType, BorderLayout.CENTER);
- JPanel patchworkPanel = new JPanel();
- patchworkPanel.add(lblPatchwork);
- patchworkPanel.add(cPatchwork);
- armorTypePanel.add(patchworkPanel, BorderLayout.SOUTH);
- baseComboBoxesPanel.add(armorTypePanel, c);
- c.gridx = 1;
- JPanel internalsPanel = new JPanel(new BorderLayout());
- internalsPanel.add(lblInternalsType, BorderLayout.NORTH);
- internalsPanel.add(spInternalsType, BorderLayout.CENTER);
- baseComboBoxesPanel.add(internalsPanel, c);
-
- c.gridx = 0; c.gridy++;;
- JPanel techLevelPanel = new JPanel(new BorderLayout());
- techLevelPanel.add(lblTechLevel, BorderLayout.NORTH);
- techLevelPanel.add(spTechLevel, BorderLayout.CENTER);
- baseComboBoxesPanel.add(techLevelPanel, c);
- c.gridx = 1;
- JPanel techBasePanel = new JPanel(new BorderLayout());
- techBasePanel.add(lblTechBase, BorderLayout.NORTH);
- techBasePanel.add(spTechBase, BorderLayout.CENTER);
- baseComboBoxesPanel.add(techBasePanel, c);
-
- return baseComboBoxesPanel;
- }
-
- private JPanel createBasePanel() {
- btnBaseClear.addActionListener(this);
-
- JPanel basePanel = new JPanel();
- GridBagConstraints c = new GridBagConstraints();
- basePanel.setLayout(new GridBagLayout());
-
- c.weighty = 0;
- c.anchor = GridBagConstraints.NORTHWEST;
- c.fill = GridBagConstraints.NONE;
- c.gridwidth = 1;
- c.insets = new Insets(20, 10, 0, 0);
- c.gridx = 0; c.gridy = 0;
-
- basePanel.add(createBaseAttributes(), c);
- c.gridx = 0; c.gridy++;;
- basePanel.add(createBaseComboBoxes(), c);
-
- c.weighty = 1;
- JPanel clearPanel = new JPanel();
- c.gridx = 0; c.gridy++;;
- clearPanel.add(btnBaseClear, c);
- basePanel.add(clearPanel, c);
-
- return basePanel;
- }
-
- private JPanel createTransportsPanel() {
- btnTransportsClear.addActionListener(this);
-
- JPanel transportsPanel = new JPanel();
- GridBagConstraints c = new GridBagConstraints();
- transportsPanel.setLayout(new GridBagLayout());
-
- c.weighty = 0;
- c.anchor = GridBagConstraints.NORTHWEST;
- c.fill = GridBagConstraints.NONE;
- c.insets = new Insets(20, 10, 0, 0);
-
- c.gridwidth = 1;
- c.gridx = 0; c.gridy++;
- JPanel mbPanel = new JPanel();
- mbPanel.add(lblMekBays);
- mbPanel.add(tStartMekBays);
- mbPanel.add(new JLabel("-"));
- mbPanel.add(tEndMekBays);
- mbPanel.add(lblMekDoors);
- mbPanel.add(tStartMekDoors);
- mbPanel.add(new JLabel("-"));
- mbPanel.add(tEndMekDoors);
- mbPanel.add(lblMekUnits);
- mbPanel.add(tStartMekUnits);
- mbPanel.add(new JLabel("-"));
- mbPanel.add(tEndMekUnits);
- transportsPanel.add(mbPanel, c);
- c.insets = new Insets(5, 10, 0, 0);
- c.gridx = 0; c.gridy++;
- JPanel abPanel = new JPanel();
- abPanel.add(lblASFBays);
- abPanel.add(tStartASFBays);
- abPanel.add(new JLabel("-"));
- abPanel.add(tEndASFBays);
- abPanel.add(lblASFDoors);
- abPanel.add(tStartASFDoors);
- abPanel.add(new JLabel("-"));
- abPanel.add(tEndASFDoors);
- abPanel.add(lblASFUnits);
- abPanel.add(tStartASFUnits);
- abPanel.add(new JLabel("-"));
- abPanel.add(tEndASFUnits);
- transportsPanel.add(abPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel scbPanel = new JPanel();
- scbPanel.add(lblSmallCraftBays);
- scbPanel.add(tStartSmallCraftBays);
- scbPanel.add(new JLabel("-"));
- scbPanel.add(tEndSmallCraftBays);
- scbPanel.add(lblSmallCraftDoors);
- scbPanel.add(tStartSmallCraftDoors);
- scbPanel.add(new JLabel("-"));
- scbPanel.add(tEndSmallCraftDoors);
- scbPanel.add(lblSmallCraftUnits);
- scbPanel.add(tStartSmallCraftUnits);
- scbPanel.add(new JLabel("-"));
- scbPanel.add(tEndSmallCraftUnits);
- transportsPanel.add(scbPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel dPanel = new JPanel();
- dPanel.add(lblDropshuttleBays);
- dPanel.add(tStartDropshuttleBays);
- dPanel.add(new JLabel("-"));
- dPanel.add(tEndDropshuttleBays);
- dPanel.add(lblDropshuttleDoors);
- dPanel.add(tStartDropshuttleDoors);
- dPanel.add(new JLabel("-"));
- dPanel.add(tEndDropshuttleDoors);
- dPanel.add(lblDropshuttleUnits);
- dPanel.add(tStartDropshuttleUnits);
- dPanel.add(new JLabel("-"));
- dPanel.add(tEndDropshuttleUnits);
- transportsPanel.add(dPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel lvPanel = new JPanel();
- lvPanel.add(lblLightVehicleBays);
- lvPanel.add(tStartLightVehicleBays);
- lvPanel.add(new JLabel("-"));
- lvPanel.add(tEndLightVehicleBays);
- lvPanel.add(lblLightVehicleDoors);
- lvPanel.add(tStartLightVehicleDoors);
- lvPanel.add(new JLabel("-"));
- lvPanel.add(tEndLightVehicleDoors);
- lvPanel.add(lblLightVehicleUnits);
- lvPanel.add(tStartLightVehicleUnits);
- lvPanel.add(new JLabel("-"));
- lvPanel.add(tEndLightVehicleUnits);
- transportsPanel.add(lvPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel hvPanel = new JPanel();
- hvPanel.add(lblHeavyVehicleBays);
- hvPanel.add(tStartHeavyVehicleBays);
- hvPanel.add(new JLabel("-"));
- hvPanel.add(tEndHeavyVehicleBays);
- hvPanel.add(lblHeavyVehicleDoors);
- hvPanel.add(tStartHeavyVehicleDoors);
- hvPanel.add(new JLabel("-"));
- hvPanel.add(tEndHeavyVehicleDoors);
- hvPanel.add(lblHeavyVehicleUnits);
- hvPanel.add(tStartHeavyVehicleUnits);
- hvPanel.add(new JLabel("-"));
- hvPanel.add(tEndHeavyVehicleUnits);
- transportsPanel.add(hvPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel shvPanel = new JPanel();
- shvPanel.add(lblSuperHeavyVehicleBays);
- shvPanel.add(tStartSuperHeavyVehicleBays);
- shvPanel.add(new JLabel("-"));
- shvPanel.add(tEndSuperHeavyVehicleBays);
- shvPanel.add(lblSuperHeavyVehicleDoors);
- shvPanel.add(tStartSuperHeavyVehicleDoors);
- shvPanel.add(new JLabel("-"));
- shvPanel.add(tEndSuperHeavyVehicleDoors);
- shvPanel.add(lblSuperHeavyVehicleUnits);
- shvPanel.add(tStartSuperHeavyVehicleUnits);
- shvPanel.add(new JLabel("-"));
- shvPanel.add(tEndSuperHeavyVehicleUnits);
- transportsPanel.add(shvPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel pmPanel = new JPanel();
- pmPanel.add(lblProtomekBays);
- pmPanel.add(tStartProtomekBays);
- pmPanel.add(new JLabel("-"));
- pmPanel.add(tEndProtomekBays);
- pmPanel.add(lblProtomekDoors);
- pmPanel.add(tStartProtomekDoors);
- pmPanel.add(new JLabel("-"));
- pmPanel.add(tEndProtomekDoors);
- pmPanel.add(lblProtomekUnits);
- pmPanel.add(tStartProtomekUnits);
- pmPanel.add(new JLabel("-"));
- pmPanel.add(tEndProtomekUnits);
- transportsPanel.add(pmPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel baPanel = new JPanel();
- baPanel.add(lblBattleArmorBays);
- baPanel.add(tStartBattleArmorBays);
- baPanel.add(new JLabel("-"));
- baPanel.add(tEndBattleArmorBays);
- baPanel.add(lblBattleArmorDoors);
- baPanel.add(tStartBattleArmorDoors);
- baPanel.add(new JLabel("-"));
- baPanel.add(tEndBattleArmorDoors);
- baPanel.add(lblBattleArmorUnits);
- baPanel.add(tStartBattleArmorUnits);
- baPanel.add(new JLabel("-"));
- baPanel.add(tEndBattleArmorUnits);
- transportsPanel.add(baPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel iPanel = new JPanel();
- iPanel.add(lblInfantryBays);
- iPanel.add(tStartInfantryBays);
- iPanel.add(new JLabel("-"));
- iPanel.add(tEndInfantryBays);
- iPanel.add(lblInfantryDoors);
- iPanel.add(tStartInfantryDoors);
- iPanel.add(new JLabel("-"));
- iPanel.add(tEndInfantryDoors);
- iPanel.add(lblInfantryUnits);
- iPanel.add(tStartInfantryUnits);
- iPanel.add(new JLabel("-"));
- iPanel.add(tEndInfantryUnits);
- transportsPanel.add(iPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel dcPanel = new JPanel();
- dcPanel.add(lblDockingCollars);
- dcPanel.add(tStartDockingCollars);
- dcPanel.add(new JLabel("-"));
- dcPanel.add(tEndDockingCollars);
- transportsPanel.add(dcPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel tsPanel = new JPanel();
- tsPanel.add(lblTroopSpace);
- tsPanel.add(tStartTroopSpace);
- tsPanel.add(new JLabel("-"));
- tsPanel.add(tEndTroopSpace);
- transportsPanel.add(tsPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel cbPanel = new JPanel();
- cbPanel.add(lblCargoBayUnits);
- cbPanel.add(tStartCargoBayUnits);
- cbPanel.add(new JLabel("-"));
- cbPanel.add(tEndCargoBayUnits);
- transportsPanel.add(cbPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel nrfPanel = new JPanel();
- nrfPanel.add(lblNavalRepairFacilities);
- nrfPanel.add(tStartNavalRepairFacilities);
- nrfPanel.add(new JLabel("-"));
- nrfPanel.add(tEndNavalRepairFacilities);
- transportsPanel.add(nrfPanel, c);
- c.gridx = 0; c.gridy++;
- JPanel bahPanel = new JPanel();
- bahPanel.add(lblBattleArmorHandles);
- bahPanel.add(tStartBattleArmorHandles);
- bahPanel.add(new JLabel("-"));
- bahPanel.add(tEndBattleArmorHandles);
- transportsPanel.add(bahPanel, c);
-
- c.weighty = 1;
- JPanel blankPanel = new JPanel();
- c.gridx = 0; c.gridy++;;
- blankPanel.add(btnTransportsClear, c);
- transportsPanel.add(blankPanel, c);
-
- return transportsPanel;
- }
-
- private void loadTriStateItem(AbstractOptions s, JList l, int count) {
- List qs = new ArrayList<>();
- for (final Enumeration optionGroups = s.getGroups(); optionGroups.hasMoreElements(); ) {
- final IOptionGroup group = optionGroups.nextElement();
- for (final Enumeration options = group.getOptions(); options.hasMoreElements(); ) {
- final IOption option = options.nextElement();
- if (option != null) {
- qs.add(option.getDisplayableNameWithValue());
- }
- }
- }
- qs = qs.stream().sorted(String.CASE_INSENSITIVE_ORDER).collect(Collectors.toList());
-
- DefaultListModel dlm = new DefaultListModel<>();
-
- for (String q : qs) {
- dlm.addElement(new TriStateItem("\u2610", q));
- }
- l.setModel(dlm);
-
- l.setVisibleRowCount(count);
- jListSetup(l);
- }
-
- private void loadAndOr(JComboBox cb, int index) {
- cb.addItem(Messages.getString("MekSelectorDialog.Search.and"));
- cb.addItem(Messages.getString("MekSelectorDialog.Search.or"));
- cb.setSelectedIndex(index);
- }
-
- private JPanel createQuirkPanel() {
- btnQuirksClear.addActionListener(this);
-
- loadAndOr(cQuirkInclue, 0);
- loadAndOr(cQuirkExclude, 1);
- loadTriStateItem(new Quirks(), listQuirkType, 25);
-
- loadAndOr(cWeaponQuirkInclue, 0);
- loadAndOr(cWeaponQuirkExclude, 1);
- cWeaponQuirkExclude.setSelectedIndex(1);
-
- loadTriStateItem(new WeaponQuirks(), listWeaponQuirkType, 17);
-
- JPanel quirksPanel = new JPanel();
- GridBagConstraints c = new GridBagConstraints();
- quirksPanel.setLayout(new GridBagLayout());
-
- c.weighty = 0;
- c.anchor = GridBagConstraints.NORTHWEST;
- c.fill = GridBagConstraints.NONE;
- c.insets = new Insets(20, 10, 0, 0);
- c.gridx = 0; c.gridy++;;
- JPanel quirkPanel = new JPanel(new BorderLayout());
- JPanel quirkIEPanel = new JPanel(new FlowLayout());
- quirkIEPanel.add(lblQuirkType);
- quirkIEPanel.add(Box.createHorizontalStrut(15));
- quirkIEPanel.add(lblQuirkInclude);
- quirkIEPanel.add(cQuirkInclue);
- quirkIEPanel.add(lblQuirkExclude);
- quirkIEPanel.add(cQuirkExclude);
- quirkPanel.add(quirkIEPanel, BorderLayout.NORTH);
- quirkPanel.add(spQuirkType, BorderLayout.CENTER);
- quirksPanel.add(quirkPanel, c);
- c.gridx = 1;
- JPanel weaponQuirkPanel = new JPanel(new BorderLayout());
- JPanel weaponQuirkIEPanel = new JPanel(new FlowLayout());
- weaponQuirkIEPanel.add(lblWeaponQuirkType);
- weaponQuirkIEPanel.add(Box.createHorizontalStrut(15));
- weaponQuirkIEPanel.add(lblWeaponQuirkInclude);
- weaponQuirkIEPanel.add(cWeaponQuirkInclue);
- weaponQuirkIEPanel.add(lblWeaponQuirkExclude);
- weaponQuirkIEPanel.add(cWeaponQuirkExclude);
- weaponQuirkPanel.add(weaponQuirkIEPanel, BorderLayout.NORTH);
- weaponQuirkPanel.add(spWeaponQuirkType, BorderLayout.CENTER);
- quirksPanel.add(weaponQuirkPanel, c);
- c.weighty = 1;
- JPanel blankPanel = new JPanel();
- c.gridx = 0; c.gridy++;;
- blankPanel.add(btnQuirksClear, c);
- quirksPanel.add(blankPanel, c);
-
- return quirksPanel;
- }
-
- private JPanel createUnitTypePanel() {
- btnUnitTypeClear.addActionListener(this);
-
- Border emptyBorder = BorderFactory.createEmptyBorder(1, 1, 1, 1);
- btnFilterMek.setBorder(emptyBorder);
- btnFilterMek.addActionListener(this);
- btnFilterBipedMek.setBorder(emptyBorder);
- btnFilterBipedMek.addActionListener(this);
- btnFilterProtoMek.setBorder(emptyBorder);
- btnFilterProtoMek.addActionListener(this);
- btnFilterLAM.setBorder(emptyBorder);
- btnFilterLAM.addActionListener(this);
- btnFilterTripod.setBorder(emptyBorder);
- btnFilterTripod.addActionListener(this);
- btnFilterQuad.setBorder(emptyBorder);
- btnFilterQuad.addActionListener(this);
- btnFilterQuadVee.setBorder(emptyBorder);
- btnFilterQuadVee.addActionListener(this);
- btnFilterAero.setBorder(emptyBorder);
- btnFilterAero.addActionListener(this);
- btnFilterFixedWingSupport.setBorder(emptyBorder);
- btnFilterFixedWingSupport.addActionListener(this);
- btnFilterConvFighter.setBorder(emptyBorder);
- btnFilterConvFighter.addActionListener(this);
- btnFilterSmallCraft.setBorder(emptyBorder);
- btnFilterSmallCraft.addActionListener(this);
- btnFilterDropship.setBorder(emptyBorder);
- btnFilterDropship.addActionListener(this);
- btnFilterJumpship.setBorder(emptyBorder);
- btnFilterJumpship.addActionListener(this);
- btnFilterWarship.setBorder(emptyBorder);
- btnFilterWarship.addActionListener(this);
- btnFilterSpaceStation.setBorder(emptyBorder);
- btnFilterSpaceStation.addActionListener(this);
- btnFilterInfantry.setBorder(emptyBorder);
- btnFilterInfantry.addActionListener(this);
- btnFilterBattleArmor.setBorder(emptyBorder);
- btnFilterBattleArmor.addActionListener(this);
- btnFilterTank.setBorder(emptyBorder);
- btnFilterTank.addActionListener(this);
- btnFilterVTOL.setBorder(emptyBorder);
- btnFilterVTOL.addActionListener(this);
- btnFilterSupportVTOL.setBorder(emptyBorder);;
- btnFilterSupportVTOL.addActionListener(this);
- btnFilterGunEmplacement.setBorder(emptyBorder);
- btnFilterGunEmplacement.addActionListener(this);
- btnFilterSupportTank.setBorder(emptyBorder);
- btnFilterSupportTank.addActionListener(this);
- btnFilterLargeSupportTank.setBorder(emptyBorder);;
- btnFilterLargeSupportTank.addActionListener(this);
- btnFilterSuperHeavyTank.setBorder(emptyBorder);
- btnFilterSuperHeavyTank.addActionListener(this);
- btnFilterOmni.setBorder(emptyBorder);
- btnFilterOmni.addActionListener(this);
- btnFilterMilitary.setBorder(emptyBorder);
- btnFilterMilitary.addActionListener(this);
- btnFilterIndustrial.setBorder(emptyBorder);
- btnFilterIndustrial.addActionListener(this);
- btnFilterMountedInfantry.setBorder(emptyBorder);
- btnFilterMountedInfantry.addActionListener(this);
- btnFilterWaterOnly.setBorder(emptyBorder);
- btnFilterWaterOnly.addActionListener(this);
- btnFilterSupportVehicle.setBorder(emptyBorder);
- btnFilterSupportVehicle.addActionListener(this);
- btnFilterAerospaceFighter.setBorder(emptyBorder);
- btnFilterAerospaceFighter.addActionListener(this);
- btnFilterDoomedOnGround.setBorder(emptyBorder);
- btnFilterDoomedOnGround.addActionListener(this);
- btnFilterDoomedInAtmosphere.setBorder(emptyBorder);
- btnFilterDoomedInAtmosphere.addActionListener(this);
- btnFilterDoomedInSpace.setBorder(emptyBorder);
- btnFilterDoomedInSpace.addActionListener(this);
- btnFilterDoomedInExtremeTemp.setBorder(emptyBorder);
- btnFilterDoomedInExtremeTemp.addActionListener(this);
- btnFilterDoomedInVacuum.setBorder(emptyBorder);
- btnFilterDoomedInVacuum.addActionListener(this);
-
- JPanel unitTypePanel = new JPanel();
- unitTypePanel.setLayout(new GridBagLayout());
- GridBagConstraints c = new GridBagConstraints();
-
- c.weighty = 0;
- c.anchor = GridBagConstraints.NORTHWEST;
- c.fill = GridBagConstraints.NONE;
- c.insets = new Insets(20, 10, 0, 0);
- c.gridwidth = 1;
- c.gridx = 0; c.gridy = 0;
- JPanel filterProtoMekPanel = new JPanel();
- filterProtoMekPanel.add(btnFilterProtoMek);
- filterProtoMekPanel.add(lblFilterProtoMek);
- unitTypePanel.add(filterProtoMekPanel, c);
- c.insets = new Insets(0, 10, 0, 0);
-
- c.gridx = 0;
- c.gridy++;
- JPanel filterMekPanel = new JPanel();
- filterMekPanel.add(btnFilterMek);
- filterMekPanel.add(lblFilterMek);
- unitTypePanel.add(filterMekPanel, c);
- c.gridx = 1;
- JPanel filterBipedMekPanel = new JPanel();
- filterBipedMekPanel.add(btnFilterBipedMek);
- filterBipedMekPanel.add(lblFilterBipedMek);
- unitTypePanel.add(filterBipedMekPanel, c);
- c.gridx = 2;
- JPanel filterLAMMekPanel = new JPanel();
- filterLAMMekPanel.add(btnFilterLAM);
- filterLAMMekPanel.add(lblFilterLAM);
- unitTypePanel.add(filterLAMMekPanel, c);
-
- c.gridy++;
- c.gridx = 1;
- JPanel filterTripodPanel = new JPanel();
- filterTripodPanel.add(btnFilterTripod);
- filterTripodPanel.add(lblFilterTripod);
- unitTypePanel.add(filterTripodPanel, c);
- c.gridy++;
- JPanel filterQuadPanel = new JPanel();
- filterQuadPanel.add(btnFilterQuad);
- filterQuadPanel.add(lblFilterQuad);
- unitTypePanel.add(filterQuadPanel, c);
- c.gridx = 2;
- JPanel filterQuadVeePanel = new JPanel();
- filterQuadVeePanel.add(btnFilterQuadVee);
- filterQuadVeePanel.add(lblFilterQuadVee);
- unitTypePanel.add(filterQuadVeePanel, c);
-
- c.gridx = 0;
- c.gridy++;
- JPanel filterAeroPanel = new JPanel();
- filterAeroPanel.add(btnFilterAero);
- filterAeroPanel.add(lblFilterAero);
- unitTypePanel.add(filterAeroPanel, c);
- c.gridx = 1;
- JPanel filterAerospaceFighterPanel = new JPanel();
- filterAerospaceFighterPanel.add(btnFilterAerospaceFighter);
- filterAerospaceFighterPanel.add(lblFilterAerospaceFighter);
- unitTypePanel.add(filterAerospaceFighterPanel, c);
- c.gridx = 2;
- JPanel filterConvFighterPanel = new JPanel();
- filterConvFighterPanel.add(btnFilterConvFighter);
- filterConvFighterPanel.add(lblFilterConvFighter);
- unitTypePanel.add(filterConvFighterPanel, c);
- c.gridx = 3;
- JPanel filterFixedWingSupportPanel = new JPanel();
- filterFixedWingSupportPanel.add(btnFilterFixedWingSupport);
- filterFixedWingSupportPanel.add(lblFilterFixedWingSupport);
- unitTypePanel.add(filterFixedWingSupportPanel, c);
-
- c.gridy++;
- c.gridx = 1;
- JPanel filterSmallCraftPanel = new JPanel();
- filterSmallCraftPanel.add(btnFilterSmallCraft);
- filterSmallCraftPanel.add(lblFilterSmallCraft);
- unitTypePanel.add(filterSmallCraftPanel, c);
- c.gridx = 2;
- JPanel filterDropship = new JPanel();
- filterDropship.add(btnFilterDropship);
- filterDropship.add(lblFilterDropship);
- unitTypePanel.add(filterDropship, c);
-
- c.gridy++;
- c.gridx = 1;
- JPanel filterJumpshipPanel = new JPanel();
- filterJumpshipPanel.add(btnFilterJumpship);
- filterJumpshipPanel.add(lblFilterJumpship);
- unitTypePanel.add(filterJumpshipPanel, c);
- c.gridx = 2;
- JPanel filterWarshipPanel = new JPanel();
- filterWarshipPanel.add(btnFilterWarship);
- filterWarshipPanel.add(lblFilterWarship);
- unitTypePanel.add(filterWarshipPanel, c);
-
- c.gridy++;
- JPanel filterSpaceStationPanel = new JPanel();
- filterSpaceStationPanel.add(btnFilterSpaceStation);
- filterSpaceStationPanel.add(lblFilterSpaceStation);
- unitTypePanel.add(filterSpaceStationPanel, c);
-
- c.gridx = 0;
- c.gridy++;
- JPanel filterInfantryPanel = new JPanel();
- filterInfantryPanel.add(btnFilterInfantry);
- filterInfantryPanel.add(lblFilterInfantry);
- unitTypePanel.add(filterInfantryPanel, c);
- c.gridx = 1;
- JPanel filterBattleArmorPanel = new JPanel();
- filterBattleArmorPanel.add(btnFilterBattleArmor);
- filterBattleArmorPanel.add(lblFilterBattleArmor);
- unitTypePanel.add(filterBattleArmorPanel, c);
-
- c.gridx = 0; c.gridy++;
- JPanel filterTankPanel = new JPanel();
- filterTankPanel.add(btnFilterTank);
- filterTankPanel.add(lblFilterTank);
- unitTypePanel.add(filterTankPanel, c);
- c.gridx = 1;
- JPanel filterVTOLPanel = new JPanel();
- filterVTOLPanel.add(btnFilterVTOL);
- filterVTOLPanel.add(lblFilterVTOL);
- unitTypePanel.add(filterVTOLPanel, c);
- c.gridx = 2;
- JPanel filterrSupportVTOLPanel = new JPanel();
- filterrSupportVTOLPanel.add(btnFilterSupportVTOL);
- filterrSupportVTOLPanel.add(lblFilterSupportVTOL);
- unitTypePanel.add(filterrSupportVTOLPanel, c);
-
- c.gridy++;
- c.gridx = 1;
- JPanel filterGunEmplacementPanel = new JPanel();
- filterGunEmplacementPanel.add(btnFilterGunEmplacement);
- filterGunEmplacementPanel.add(lblFilterGunEmplacement);
- unitTypePanel.add(filterGunEmplacementPanel, c);
-
- c.gridy++;
- JPanel filterSupportTankPanel = new JPanel();
- filterSupportTankPanel.add(btnFilterSupportTank);
- filterSupportTankPanel.add(lblFilterSupportTank);
- unitTypePanel.add(filterSupportTankPanel, c);
- c.gridx = 2;
- JPanel filterrLargeSupportTankPanel = new JPanel();
- filterrLargeSupportTankPanel.add(btnFilterLargeSupportTank);
- filterrLargeSupportTankPanel.add(lblFilterLargeSupportTank);
- unitTypePanel.add(filterrLargeSupportTankPanel, c);
-
- c.gridy++;
- c.gridx = 1;
- JPanel filterSuperHeavyTankPanel = new JPanel();
- filterSuperHeavyTankPanel.add(btnFilterSuperHeavyTank);
- filterSuperHeavyTankPanel.add(lblFilterSuperHeavyTank);
- unitTypePanel.add(filterSuperHeavyTankPanel, c);
-
- c.gridy++;
- c.gridx = 0;
- c.fill = GridBagConstraints.BOTH;
- c.gridwidth = 4;
- JPanel dotSep = new JPanel();
- dotSep.setLayout(new BoxLayout(dotSep, BoxLayout.PAGE_AXIS));
- dotSep.add(new ASAdvancedSearchPanel.DottedSeparator());
- unitTypePanel.add(dotSep, c);
-
- c.gridx = 0; c.gridy++;
- c.fill = GridBagConstraints.NONE;
- c.gridwidth = 5;
- JPanel filter1Panel = new JPanel();
- filter1Panel.add(btnFilterOmni);
- filter1Panel.add(lblFilterOmni);
- filter1Panel.add(btnFilterMilitary);
- filter1Panel.add(lblFilterMilitary);
- filter1Panel.add(btnFilterIndustrial);
- filter1Panel.add(lblFilterIndustrial);
- filter1Panel.add(btnFilterMountedInfantry);
- filter1Panel.add(lblFilterMountedInfantry);
- filter1Panel.add(btnFilterSupportVehicle);
- filter1Panel.add(lblFilterSupportVehicle);
- unitTypePanel.add(filter1Panel, c);
-
- c.gridx = 0; c.gridy++;
- JPanel filter2Panel = new JPanel();
- filter2Panel.add(btnFilterWaterOnly);
- filter2Panel.add(lblFilterWaterOnly);
- filter2Panel.add(btnFilterDoomedInExtremeTemp);
- filter2Panel.add(lblFilterDoomedInExtremeTemp);
- filter2Panel.add(btnFilterDoomedInVacuum);
- filter2Panel.add(lblFilterDoomedInVacuum);
- unitTypePanel.add(filter2Panel, c);
-
-
- c.gridx = 0; c.gridy++;
- JPanel filter3Panel = new JPanel();
- filter3Panel.add(btnFilterDoomedOnGround);
- filter3Panel.add(lblFilterDoomedOnGround);
- filter3Panel.add(btnFilterDoomedInAtmosphere);
- filter3Panel.add(lblFilterDoomedInAtmosphere);
- filter3Panel.add(btnFilterDoomedInSpace);
- filter3Panel.add(lblFilterDoomedInSpace);
- unitTypePanel.add(filter3Panel, c);
-
- c.gridx = 0; c.gridy++;;
- c.weighty = 1;
- JPanel blankPanel = new JPanel();
- blankPanel.add(btnUnitTypeClear);
- unitTypePanel.add(blankPanel, c);
-
-
- return unitTypePanel;
- }
-
- private JPanel createWeaponEqPanel() {
- // Initialize Items
- btnWEAnd.addActionListener(this);
- btnWEAdd.addActionListener(this);
- btnWELeftParen.addActionListener(this);
- btnWERightParen.addActionListener(this);
- btnWEOr.addActionListener(this);
- btnWEClear.addActionListener(this);
- btnWEBack.addActionListener(this);
-
- btnWEBack.setEnabled(false);
- btnWEAdd.setEnabled(false);
-
- for (int i = 1; i <= 20; i++) {
- cboQty.addItem(Integer.toString(i));
- }
- cboQty.setSelectedIndex(0);
-
- // Setup table filter combo boxes
- DefaultComboBoxModel unitTypeModel = new DefaultComboBoxModel<>();
- unitTypeModel.addElement(Messages.getString("MekSelectorDialog.All"));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.MEK));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.TANK));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.BATTLE_ARMOR));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.INFANTRY));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.PROTOMEK));
- unitTypeModel.addElement(UnitType.getTypeDisplayableName(UnitType.AERO));
- unitTypeModel.setSelectedItem(Messages.getString("MekSelectorDialog.All"));
-
- cboUnitType.setModel(unitTypeModel);
- cboUnitType.addActionListener(this);
-
- DefaultComboBoxModel techLevelModel = new DefaultComboBoxModel<>();
-
- for (int i = 0; i < TechConstants.SIZE; i++) {
- techLevelModel.addElement(TechConstants.getLevelDisplayableName(i));
- }
-
- techLevelModel.setSelectedItem(TechConstants.getLevelDisplayableName(TechConstants.SIZE - 1));
- cboTechLevel.setModel(techLevelModel);
- cboTechLevel.addActionListener(this);
-
- DefaultComboBoxModel techClassModel = new DefaultComboBoxModel<>();
- techClassModel.addElement("All");
- techClassModel.addElement("Inner Sphere");
- techClassModel.addElement("Clan");
- techClassModel.addElement("IS/Clan");
- techClassModel.addElement("(Unknown Technology Base)");
- techClassModel.setSelectedItem("All");
- cboTechClass.setModel(techClassModel);
- cboTechClass.addActionListener(this);
-
- // Set up Weapon Class table
- weaponTypesModel = new WeaponClassTableModel();
- tblWeaponType = new MegaMekTable(weaponTypesModel, WeaponClassTableModel.COL_NAME);
- TableColumn wpsTypeCol = tblWeaponType.getColumnModel().getColumn(WeaponClassTableModel.COL_QTY);
- wpsTypeCol.setCellEditor(new DefaultCellEditor(cboQty));
- tblWeaponType.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- weaponTypesSorter = new TableRowSorter<>(weaponTypesModel);
- tblWeaponType.setRowSorter(weaponTypesSorter);
- tblWeaponType.addKeyListener(this);
- tblWeaponType.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12));
- tblWeaponType.getSelectionModel().addListSelectionListener(this);
-
- for (int i = 0; i < weaponTypesModel.getColumnCount(); i++) {
- tblWeaponType.getColumnModel().getColumn(i).setPreferredWidth(weaponTypesModel.getPreferredWidth(i));
- }
-
- scrTableWeaponType.setViewportView(tblWeaponType);
-
- // Setup Weapons Table
- weaponsModel = new WeaponsTableModel();
- tblWeapons = new MegaMekTable(weaponsModel, WeaponsTableModel.COL_NAME);
- TableColumn wpsCol = tblWeapons.getColumnModel().getColumn(WeaponsTableModel.COL_QTY);
- wpsCol.setCellEditor(new DefaultCellEditor(cboQty));
- tblWeapons.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- weaponsSorter = new TableRowSorter<>(weaponsModel);
- tblWeapons.setRowSorter(weaponsSorter);
- tblWeapons.addKeyListener(this);
- tblWeapons.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12));
- tblWeapons.getSelectionModel().addListSelectionListener(this);
-
- for (int i = 0; i < weaponsModel.getColumnCount(); i++) {
- tblWeapons.getColumnModel().getColumn(i).setPreferredWidth(weaponsModel.getPreferredWidth(i));
- }
-
- scrTableWeapons.setViewportView(tblWeapons);
-
- // Setup Equipment Table
- equipmentModel = new EquipmentTableModel();
- tblEquipment = new MegaMekTable(equipmentModel, EquipmentTableModel.COL_NAME);
- TableColumn eqCol = tblEquipment.getColumnModel().getColumn(EquipmentTableModel.COL_QTY);
- eqCol.setCellEditor(new DefaultCellEditor(cboQty));
- tblEquipment.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
- equipmentSorter = new TableRowSorter<>(equipmentModel);
- tblEquipment.setRowSorter(equipmentSorter);
- tblEquipment.addKeyListener(this);
- tblEquipment.setFont(new Font(MMConstants.FONT_MONOSPACED, Font.PLAIN, 12));
- tblEquipment.getSelectionModel().addListSelectionListener(this);
-
- for (int i = 0; i < equipmentModel.getColumnCount(); i++) {
- tblEquipment.getColumnModel().getColumn(i).setPreferredWidth(equipmentModel.getPreferredWidth(i));
- }
-
- scrTableEquipment.setViewportView(tblEquipment);
-
- // Populate Tables
- populateWeaponsAndEquipmentChoices();
-
- // initialize with the weapons sorted alphabetically by name
- ArrayList sortlist = new ArrayList<>();
- sortlist.add(new RowSorter.SortKey(WeaponsTableModel.COL_NAME, SortOrder.ASCENDING));
- tblWeapons.getRowSorter().setSortKeys(sortlist);
- ((DefaultRowSorter, ?>) tblWeapons.getRowSorter()).sort();
- tblWeapons.invalidate(); // force re-layout of window
-
- // initialize with the equipment sorted alphabetically by chassis
- sortlist = new ArrayList<>();
- sortlist.add(new RowSorter.SortKey(EquipmentTableModel.COL_NAME, SortOrder.ASCENDING));
- tblEquipment.getRowSorter().setSortKeys(sortlist);
- ((DefaultRowSorter, ?>) tblEquipment.getRowSorter()).sort();
- tblEquipment.invalidate(); // force re-layout of window
-
- txtWEEqExp.setEditable(false);
- txtWEEqExp.setLineWrap(true);
- txtWEEqExp.setWrapStyleWord(true);
-
- // table
- JPanel weaponEqPanel = new JPanel();
- weaponEqPanel.setLayout(new GridBagLayout());
- GridBagConstraints c = new GridBagConstraints();
-
- c.weighty = 0;
- c.anchor = GridBagConstraints.NORTHWEST;
- c.fill = GridBagConstraints.NONE;
- c.insets = new Insets(0, 0, 0, 0);
- c.gridx = 0; c.gridy++;
- weaponEqPanel.add(lblTableFilters, c);
- c.gridx = 0; c.gridy++;
- c.gridwidth = 4;
- c.anchor = GridBagConstraints.CENTER;
- c.insets = new Insets(0, 40, 0, 0);
- JPanel cboPanel = new JPanel();
- cboPanel.add(lblUnitType);
- cboPanel.add(cboUnitType);
- cboPanel.add(lblTechClass);
- cboPanel.add(cboTechClass);
- cboPanel.add(lblTechLevelBase, c);
- cboPanel.add(cboTechLevel, c);
- weaponEqPanel.add(cboPanel, c);
- c.gridwidth = 1;
-
- c.gridx = 0; c.gridy++;
- c.anchor = GridBagConstraints.WEST;
- c.insets = new Insets(0, 0, 0, 0);
- weaponEqPanel.add(lblWeaponClass, c);
-
- c.fill = GridBagConstraints.HORIZONTAL;
- c.anchor = GridBagConstraints.CENTER;
- c.gridwidth = 5;
- c.gridx = 0; c.gridy++;
- weaponEqPanel.add(scrTableWeaponType, c);
- c.gridwidth = 1;
-
- c.fill = GridBagConstraints.NONE;
- c.gridx = 0; c.gridy++;
- c.anchor = GridBagConstraints.WEST;
- weaponEqPanel.add(lblWeapons, c);
-
- c.fill = GridBagConstraints.HORIZONTAL;
- c.anchor = GridBagConstraints.CENTER;
- c.gridwidth = 5;
- c.gridx = 0; c.gridy++;
- weaponEqPanel.add(scrTableWeapons, c);
-
- c.fill = GridBagConstraints.NONE;
- c.gridwidth = 1;
- c.gridx = 0; c.gridy++;
- c.anchor = GridBagConstraints.WEST;
- weaponEqPanel.add(lblEquipment, c);
-
- c.fill = GridBagConstraints.HORIZONTAL;
- c.anchor = GridBagConstraints.CENTER;
- c.gridwidth = 5;
- c.gridx = 0; c.gridy++;
- weaponEqPanel.add(scrTableEquipment, c);
-
- c.insets = new Insets(0, 50, 0, 0);
- c.fill = GridBagConstraints.NONE;
- c.gridx = 0; c.gridy++;
- c.gridwidth = 4;
- JPanel btnPanel = new JPanel();
- btnPanel.add(btnWEAdd, c);
- btnPanel.add(btnWELeftParen, c);
- btnPanel.add(btnWERightParen, c);
- btnPanel.add(btnWEAnd, c);
- btnPanel.add(btnWEOr, c);
- btnPanel.add(btnWEBack, c);
- btnPanel.add(btnWEClear, c);
- weaponEqPanel.add(btnPanel, c);
-
- // Filter Expression
- c.insets = new Insets(0, 0, 0, 0);
- c.gridx = 0; c.gridy++;
- c.gridwidth = 1;
- c.anchor = GridBagConstraints.WEST;
- c.fill = GridBagConstraints.NONE;
- weaponEqPanel.add(lblWEEqExpTxt, c);
- c.anchor = GridBagConstraints.CENTER;
- c.fill = GridBagConstraints.HORIZONTAL;
- c.gridx = 1;
- c.gridwidth = 3;
- weaponEqPanel.add(expWEScroller, c);
- c.weighty = 1;
- JPanel blankPanel = new JPanel();
- weaponEqPanel.add(blankPanel, c);
-
- return weaponEqPanel;
- }
-
- /**
- * Listener for check box state changes
- */
- @Override
- public void itemStateChanged(ItemEvent e) {
-
- }
-
- /**
- * Selection Listener for Weapons and Equipment tables. Checks to see if
- * a row is selected and if it is, enables the corresponding the add button.
- */
- @Override
- public void valueChanged(ListSelectionEvent evt) {
- boolean lastTokIsOperation;
- int tokSize = filterToks.size();
- lastTokIsOperation = ((tokSize == 0) ||
- (filterToks.elementAt(tokSize - 1) instanceof OperationFT));
- if (evt.getSource().equals(tblWeapons.getSelectionModel())) {
- if ((tblWeapons.getSelectedRow() >= 0) && lastTokIsOperation) {
- tblEquipment.clearSelection();
- tblWeaponType.clearSelection();
- btnWEAdd.setEnabled(true);
- } else if (tblWeapons.getSelectedRow() >= 0) {
- tblEquipment.clearSelection();
- tblWeaponType.clearSelection();
- }
- } else if (evt.getSource().equals(tblEquipment.getSelectionModel())) {
- if ((tblEquipment.getSelectedRow() >= 0) && lastTokIsOperation) {
- tblWeapons.clearSelection();
- tblWeaponType.clearSelection();
- btnWEAdd.setEnabled(true);
- } else if (tblEquipment.getSelectedRow() >= 0) {
- tblWeapons.clearSelection();
- tblWeaponType.clearSelection();
- }
- } else if (evt.getSource().equals(tblWeaponType.getSelectionModel())) {
- if ((tblWeaponType.getSelectedRow() >= 0) && lastTokIsOperation) {
- tblWeapons.clearSelection();
- tblEquipment.clearSelection();
- btnWEAdd.setEnabled(true);
- } else if (tblWeaponType.getSelectedRow() >= 0) {
- tblWeapons.clearSelection();
- tblEquipment.clearSelection();
- }
- }
- }
-
- /**
- * Convenience method for enabling the buttons related to weapon/equipment
- * selection for filtering (btnAddEquipment, btnAddWeapon, etc)
- */
- private void enableSelectionButtons() {
- if ((tblWeapons.getSelectedRow() != -1) ||
- (tblEquipment.getSelectedRow() != -1) ||
- (tblWeaponType.getSelectedRow() != -1)) {
- btnWEAdd.setEnabled(true);
- }
- btnWELeftParen.setEnabled(true);
- }
-
- /**
- * Convenience method for disabling the buttons related to weapon/equipment
- * selection for filtering (btnAddEquipment, btnAddWeapon, etc)
- */
- private void disableSelectionButtons() {
- btnWEAdd.setEnabled(false);
- btnWELeftParen.setEnabled(false);
- }
-
- /**
- * Convenience method for enabling the buttons related to filter operations
- * for filtering (btnAnd, btnOr, etc)
- */
- private void enableOperationButtons() {
- btnWEOr.setEnabled(true);
- btnWEAnd.setEnabled(true);
- btnWERightParen.setEnabled(true);
- }
-
- /**
- * Convenience method for disabling the buttons related to filter operations
- * for filtering (btnAnd, btnOr, etc)
- */
- private void disableOperationButtons() {
- btnWEOr.setEnabled(false);
- btnWEAnd.setEnabled(false);
- btnWERightParen.setEnabled(false);
- }
-
- public void prepareFilter() {
- try {
- mekFilter = new MekSearchFilter(mekFilter);
- mekFilter.createFilterExpressionFromTokens(filterToks);
- updateMekSearchFilter();
- } catch (MekSearchFilter.FilterParsingException e) {
- JOptionPane.showMessageDialog(this,
- "Error parsing filter expression!\n\n" + e.msg,
- "Filter Expression Parsing Error",
- JOptionPane.ERROR_MESSAGE);
- }
- }
-
- /**
- * Listener for button presses.
- */
- @Override
- public void actionPerformed(java.awt.event.ActionEvent ev) {
- if (ev.getSource().equals(cboUnitType)
- || ev.getSource().equals(cboTechLevel)
- || ev.getSource().equals(cboTechClass)) {
- filterTables();
- } else if (ev.getSource().equals(btnWEAdd)) {
- int row = tblEquipment.getSelectedRow();
- if (row >= 0) {
- String internalName = (String)
- tblEquipment.getModel().getValueAt(
- tblEquipment.convertRowIndexToModel(row),
- EquipmentTableModel.COL_INTERNAL_NAME);
- String fullName = (String) tblEquipment.getValueAt(row, EquipmentTableModel.COL_NAME);
- int qty = Integer.parseInt((String)
- tblEquipment.getValueAt(row, EquipmentTableModel.COL_QTY));
- filterToks.add(new EquipmentFT(internalName, fullName, qty));
- txtWEEqExp.setText(filterExpressionString());
- btnWEBack.setEnabled(true);
- enableOperationButtons();
- disableSelectionButtons();
- }
- row = tblWeapons.getSelectedRow();
- if (row >= 0) {
- String internalName = (String)
- tblWeapons.getModel().getValueAt(
- tblWeapons.convertRowIndexToModel(row),
- WeaponsTableModel.COL_INTERNAL_NAME);
- String fullName = (String) tblWeapons.getValueAt(row, WeaponsTableModel.COL_NAME);
- int qty = Integer.parseInt((String)
- tblWeapons.getValueAt(row, WeaponsTableModel.COL_QTY));
- filterToks.add(new EquipmentFT(internalName, fullName, qty));
- txtWEEqExp.setText(filterExpressionString());
- btnWEBack.setEnabled(true);
- enableOperationButtons();
- disableSelectionButtons();
- }
- row = tblWeaponType.getSelectedRow();
- if (row >= 0) {
- int qty = Integer.parseInt((String)tblWeaponType.getValueAt(row, WeaponClassTableModel.COL_QTY));
- filterToks.add(new WeaponClassFT((WeaponClass)tblWeaponType.getModel().getValueAt(tblWeaponType.convertRowIndexToModel(row), WeaponClassTableModel.COL_VAL), qty));
- txtWEEqExp.setText(filterExpressionString());
- btnWEBack.setEnabled(true);
- enableOperationButtons();
- disableSelectionButtons();
- }
- } else if (ev.getSource().equals(btnWELeftParen)) {
- filterToks.add(new ParensFT("("));
- txtWEEqExp.setText(filterExpressionString());
- btnWEBack.setEnabled(true);
- disableOperationButtons();
- enableSelectionButtons();
- btnWELeftParen.setEnabled(false);
- btnWERightParen.setEnabled(false);
- } else if (ev.getSource().equals(btnWERightParen)) {
- filterToks.add(new ParensFT(")"));
- txtWEEqExp.setText(filterExpressionString());
- btnWEBack.setEnabled(true);
- enableOperationButtons();
- disableSelectionButtons();
- btnWELeftParen.setEnabled(false);
- btnWERightParen.setEnabled(false);
- } else if (ev.getSource().equals(btnWEAnd)) {
- filterToks.add(new OperationFT(MekSearchFilter.BoolOp.AND));
- txtWEEqExp.setText(filterExpressionString());
- btnWEBack.setEnabled(true);
- disableOperationButtons();
- enableSelectionButtons();
- } else if (ev.getSource().equals(btnWEOr)) {
- filterToks.add(new OperationFT(MekSearchFilter.BoolOp.OR));
- txtWEEqExp.setText(filterExpressionString());
- btnWEBack.setEnabled(true);
- disableOperationButtons();
- enableSelectionButtons();
- } else if (ev.getSource().equals(btnWEBack)) {
- if (!filterToks.isEmpty()) {
- filterToks.remove(filterToks.size() - 1);
- txtWEEqExp.setText(filterExpressionString());
- if (filterToks.isEmpty()) {
- btnWEBack.setEnabled(false);
- }
-
- if ((filterToks.isEmpty()) || (filterToks.lastElement() instanceof OperationFT)) {
- disableOperationButtons();
- enableSelectionButtons();
- } else {
- enableOperationButtons();
- disableSelectionButtons();
- }
- }
- } else if (ev.getSource().equals(btnWEClear)) {
- clearWeaponsEquipment();
- } else if (ev.getSource().equals(btnBaseClear)) {
- clearBase();
- } else if (ev.getSource().equals(btnUnitTypeClear)) {
- clearUnitType();
- } else if (ev.getSource().equals(btnTransportsClear)) {
- clearTransports();
- } else if (ev.getSource().equals(btnQuirksClear)) {
- clearQuirks();
- } else if (ev.getSource().equals(btnFilterMek)) {
- toggleText(btnFilterMek);
- } else if (ev.getSource().equals(btnFilterBipedMek)) {
- toggleText(btnFilterBipedMek);
- } else if (ev.getSource().equals(btnFilterProtoMek)) {
- toggleText(btnFilterProtoMek);
- } else if (ev.getSource().equals(btnFilterLAM)) {
- toggleText(btnFilterLAM);
- } else if (ev.getSource().equals(btnFilterTripod)) {
- toggleText(btnFilterTripod);
- } else if (ev.getSource().equals(btnFilterQuad)) {
- toggleText(btnFilterQuad);
- } else if (ev.getSource().equals(btnFilterQuadVee)) {
- toggleText(btnFilterQuadVee);
- } else if (ev.getSource().equals(btnFilterAero)) {
- toggleText(btnFilterAero);
- } else if (ev.getSource().equals(btnFilterFixedWingSupport)) {
- toggleText(btnFilterFixedWingSupport);
- } else if (ev.getSource().equals(btnFilterConvFighter)) {
- toggleText(btnFilterConvFighter);
- } else if (ev.getSource().equals(btnFilterSmallCraft)) {
- toggleText(btnFilterSmallCraft);
- } else if (ev.getSource().equals(btnFilterDropship)) {
- toggleText(btnFilterDropship);
- } else if (ev.getSource().equals(btnFilterJumpship)) {
- toggleText(btnFilterJumpship);
- } else if (ev.getSource().equals(btnFilterWarship)) {
- toggleText(btnFilterWarship);
- } else if (ev.getSource().equals(btnFilterSpaceStation)) {
- toggleText(btnFilterSpaceStation);
- } else if (ev.getSource().equals(btnFilterInfantry)) {
- toggleText(btnFilterInfantry);
- } else if (ev.getSource().equals(btnFilterBattleArmor)) {
- toggleText(btnFilterBattleArmor);
- } else if (ev.getSource().equals(btnFilterTank)) {
- toggleText(btnFilterTank);
- } else if (ev.getSource().equals(btnFilterVTOL)) {
- toggleText(btnFilterVTOL);
- } else if (ev.getSource().equals(btnFilterSupportVTOL)) {
- toggleText(btnFilterSupportVTOL);
- } else if (ev.getSource().equals(btnFilterGunEmplacement)) {
- toggleText(btnFilterGunEmplacement);
- } else if (ev.getSource().equals(btnFilterFixedWingSupport)) {
- toggleText(btnFilterFixedWingSupport);
- } else if (ev.getSource().equals(btnFilterSuperHeavyTank)) {
- toggleText(btnFilterSuperHeavyTank);
- } else if (ev.getSource().equals(btnFilterSupportTank)) {
- toggleText(btnFilterSupportTank);
- } else if (ev.getSource().equals(btnFilterLargeSupportTank)) {
- toggleText(btnFilterLargeSupportTank);
- } else if (ev.getSource().equals(btnFilterOmni)) {
- toggleText(btnFilterOmni);
- } else if (ev.getSource().equals(btnFilterMilitary)) {
- toggleText(btnFilterMilitary);
- } else if (ev.getSource().equals(btnFilterIndustrial)) {
- toggleText(btnFilterIndustrial);
- } else if (ev.getSource().equals(btnFilterMountedInfantry)) {
- toggleText(btnFilterMountedInfantry);
- } else if (ev.getSource().equals(btnFilterWaterOnly)) {
- toggleText(btnFilterWaterOnly);
- } else if (ev.getSource().equals(btnFilterSupportVehicle)) {
- toggleText(btnFilterSupportVehicle);
- } else if (ev.getSource().equals(btnFilterAerospaceFighter)) {
- toggleText(btnFilterAerospaceFighter);
- } else if (ev.getSource().equals(btnFilterDoomedOnGround)) {
- toggleText(btnFilterDoomedOnGround);
- } else if (ev.getSource().equals(btnFilterDoomedInAtmosphere)) {
- toggleText(btnFilterDoomedInAtmosphere);
- } else if (ev.getSource().equals(btnFilterDoomedInSpace)) {
- toggleText(btnFilterDoomedInSpace);
- } else if (ev.getSource().equals(btnFilterDoomedInExtremeTemp)) {
- toggleText(btnFilterDoomedInExtremeTemp);
- } else if (ev.getSource().equals(btnFilterDoomedInVacuum)) {
- toggleText(btnFilterDoomedInVacuum);
- }
- }
-
- private void toggleText(JButton b) {
- if (b.getText().equals("\u2610")) {
- b.setText("\u2611");
- } else if (b.getText().equals("\u2611")) {
- b.setText("\u2612");
- } else if (b.getText().equals("\u2612")) {
- b.setText("\u2610");
- } else {
- b.setText("\u2610");
- }
- }
-
- private void toggleText(JList list, int index) {
- ListModel m = list.getModel();
-
- for (int i = 0; i < m.getSize(); i++) {
- TriStateItem ms = m.getElementAt(i);
-
- if (index == i) {
- if (ms.state.contains("\u2610")) {
- ms.state = "\u2611";
- } else if (ms.state.contains("\u2611")) {
- ms.state = "\u2612";
- } else if (ms.state.contains("\u2612")) {
- ms.state = "\u2610";
- }
- }
- }
-
- list.setModel(m);
- list.repaint();
- }
-
- private boolean matchTechLvl(int t1, int t2) {
- return ((t1 == TechConstants.T_ALL) || (t1 == t2)
- || ((t1 == TechConstants.T_IS_TW_ALL) && (t2 <= TechConstants.T_IS_TW_NON_BOX)))
-
- || ((t1 == TechConstants.T_TW_ALL) && (t2 <= TechConstants.T_CLAN_TW))
-
- || ((t1 == TechConstants.T_ALL_IS) && ((t2 <= TechConstants.T_IS_TW_NON_BOX)
- || (t2 == TechConstants.T_IS_ADVANCED)
- || (t2 == TechConstants.T_IS_EXPERIMENTAL)
- || (t2 == TechConstants.T_IS_UNOFFICIAL)))
-
- || ((t1 == TechConstants.T_ALL_CLAN)
- && ((t2 == TechConstants.T_CLAN_TW)
- || (t2 == TechConstants.T_CLAN_ADVANCED)
- || (t2 == TechConstants.T_CLAN_EXPERIMENTAL)
- || (t2 == TechConstants.T_CLAN_UNOFFICIAL)));
- }
-
- private boolean matchTechClass(String t1, String t2) {
- if (t1.equals("All")) {
- return true;
- } else if (t1.equals("IS/Clan")) {
- return t2.equals("Inner Sphere") || t2.equals("Clan") || t1.equals(t2);
- } else {
- return t1.equals(t2);
- }
- }
-
- private boolean matchUnitType(int unitTypeFilter, EquipmentType eq) {
- // All is selected
- if (unitTypeFilter < 0) {
- return true;
- }
-
- switch (unitTypeFilter) {
- case 5:
- if (eq.hasFlag(WeaponType.F_AERO_WEAPON)
- || eq.hasFlag(MiscType.F_FIGHTER_EQUIPMENT)) {
- return true;
- }
- break;
- case UnitType.BATTLE_ARMOR:
- if (eq.hasFlag(WeaponType.F_BA_WEAPON)
- || eq.hasFlag(MiscType.F_BA_EQUIPMENT)) {
- return true;
- }
- break;
- case UnitType.INFANTRY:
- if (eq.hasFlag(WeaponType.F_INFANTRY)) {
- return true;
- }
- break;
- case UnitType.MEK:
- if (eq.hasFlag(WeaponType.F_MEK_WEAPON)
- || eq.hasFlag(MiscType.F_MEK_EQUIPMENT)) {
- return true;
- }
- break;
- case UnitType.TANK:
- if (eq.hasFlag(WeaponType.F_TANK_WEAPON)
- || eq.hasFlag(MiscType.F_TANK_EQUIPMENT)) {
- return true;
- }
- break;
- case UnitType.PROTOMEK:
- if (eq.hasFlag(WeaponType.F_PROTO_WEAPON)
- || eq.hasFlag(MiscType.F_PROTOMEK_EQUIPMENT)) {
- return true;
- }
- break;
- default:
- return false;
- }
- return false;
- }
-
- void filterTables() {
- RowFilter weaponFilter;
- RowFilter equipmentFilter;
- final int techLevel = cboTechLevel.getSelectedIndex();
- final String techClass = (String) cboTechClass.getSelectedItem();
- final int unitType = cboUnitType.getSelectedIndex() - 1;
- // If current expression doesn't parse, don't update.
- try {
- weaponFilter = new RowFilter<>() {
- @Override
- public boolean include(Entry extends WeaponsTableModel, ? extends Integer> entry) {
- WeaponsTableModel weapModel = entry.getModel();
- WeaponType wp = weapModel.getWeaponTypeAt(entry.getIdentifier());
- String currTechClass = TechConstants.getTechName(wp.getTechLevel(gameYear));
-
- boolean techLvlMatch = matchTechLvl(techLevel, wp.getTechLevel(gameYear));
- boolean techClassMatch = matchTechClass(techClass, currTechClass);
- boolean unitTypeMatch = matchUnitType(unitType, wp);
- return techLvlMatch && techClassMatch && unitTypeMatch;
- }
- };
- } catch (java.util.regex.PatternSyntaxException ignored) {
- return;
- }
- weaponsSorter.setRowFilter(weaponFilter);
-
- try {
- equipmentFilter = new RowFilter<>() {
- @Override
- public boolean include(Entry extends EquipmentTableModel, ? extends Integer> entry) {
- EquipmentTableModel eqModel = entry.getModel();
- EquipmentType eq = eqModel.getEquipmentTypeAt(entry.getIdentifier());
- String currTechClass = TechConstants.getTechName(eq.getTechLevel(gameYear));
- boolean techLvlMatch = matchTechLvl(techLevel, eq.getTechLevel(gameYear));
- boolean techClassMatch = matchTechClass(techClass, currTechClass);
- boolean unitTypeMatch = matchUnitType(unitType, eq);
- return techLvlMatch && techClassMatch && unitTypeMatch;
- }
- };
- } catch (java.util.regex.PatternSyntaxException ignored) {
- return;
- }
- equipmentSorter.setRowFilter(equipmentFilter);
- }
-
- private String filterExpressionString() {
- // Build the string representation of the new expression
- StringBuilder filterExp = new StringBuilder();
- for (int i = 0; i < filterToks.size(); i++) {
- filterExp.append(" ").append(filterToks.elementAt(i).toString()).append(" ");
- }
- return filterExp.toString();
- }
-
- /**
- * Show the dialog. setVisible(true) blocks until setVisible(false).
- *
- * @return Return the filter that was created with this dialog.
- */
- public MekSearchFilter showDialog() {
- // We need to save a copy since the user can alter the filter state
- // and then click on the cancel button. We want to make sure the
- // original filter state is saved.
- MekSearchFilter currFilter = mekFilter;
- mekFilter = new MekSearchFilter(currFilter);
- txtWEEqExp.setText(mekFilter.getEquipmentExpression());
- if ((filterToks == null) || filterToks.isEmpty()
- || (filterToks.lastElement() instanceof OperationFT)) {
- disableOperationButtons();
- enableSelectionButtons();
- } else {
- enableOperationButtons();
- disableSelectionButtons();
- }
- setVisible(true);
- if (isCanceled) {
- mekFilter = currFilter;
- } else {
- updateMekSearchFilter();
- }
- return mekFilter;
- }
-
- private void clearTriStateItem(JList l) {
- ListModel m = l.getModel();
-
- for (int i = 0; i < m.getSize(); i++) {
- TriStateItem ms = m.getElementAt(i);
- ms.state = "\u2610";
- }
-
- l.setModel(m);
- l.repaint();
- }
-
- private void clearBase() {
- tStartWalk.setText("");
- tEndWalk.setText("");
- tStartJump.setText("");
- tEndJump.setText("");
- cArmor.setSelectedIndex(0);
- cOfficial.setSelectedIndex(0);
- cCanon.setSelectedIndex(0);
- cPatchwork.setSelectedIndex(0);
- cInvalid.setSelectedIndex(0);
- cFailedToLoadEquipment.setSelectedIndex(0);
- cClanEngine.setSelectedIndex(0);
- tStartTankTurrets.setText("");
- tEndTankTurrets.setText("");
- tStartLowerArms.setText("");
- tEndLowerArms.setText("");
- tStartHands.setText("");
- tEndHands.setText("");
- tStartYear.setText("");
- tEndYear.setText("");
- tStartTons.setText("");
- tEndTons.setText("");
- tStartBV.setText("");
- tEndBV.setText("");
- tSource.setText("");
- tMULId.setText("");
-
- clearTriStateItem(listArmorType);
- clearTriStateItem(listCockpitType);
- clearTriStateItem(listEngineType);
- clearTriStateItem(listGyroType);
- clearTriStateItem(listInternalsType);
- clearTriStateItem(listTechLevel);
- clearTriStateItem(listTechBase);
- }
-
- private void clearTransports() {
- tStartTroopSpace.setText("");
- tEndTroopSpace.setText("");
- tStartASFBays.setText("");
- tEndASFBays.setText("");
- tStartASFDoors.setText("");
- tEndASFDoors.setText("");
- tStartASFUnits.setText("");
- tEndASFUnits.setText("");
- tStartSmallCraftBays.setText("");
- tEndSmallCraftBays.setText("");
- tStartSmallCraftDoors.setText("");
- tEndSmallCraftDoors.setText("");
- tStartSmallCraftUnits.setText("");
- tEndSmallCraftUnits.setText("");
- tStartMekBays.setText("");
- tEndMekBays.setText("");
- tStartMekDoors.setText("");
- tEndMekDoors.setText("");
- tStartMekUnits.setText("");
- tEndMekUnits.setText("");
- tStartHeavyVehicleBays.setText("");
- tEndHeavyVehicleBays.setText("");
- tStartHeavyVehicleDoors.setText("");
- tEndHeavyVehicleDoors.setText("");
- tStartHeavyVehicleUnits.setText("");
- tEndHeavyVehicleUnits.setText("");
- tStartLightVehicleBays.setText("");
- tEndLightVehicleBays.setText("");
- tStartLightVehicleDoors.setText("");
- tEndLightVehicleDoors.setText("");
- tStartLightVehicleUnits.setText("");
- tEndLightVehicleUnits.setText("");
- tStartProtomekBays.setText("");
- tEndProtomekBays.setText("");
- tStartProtomekDoors.setText("");
- tEndProtomekDoors.setText("");
- tStartProtomekUnits.setText("");
- tEndProtomekUnits.setText("");
- tStartBattleArmorBays.setText("");
- tEndBattleArmorBays.setText("");
- tStartBattleArmorDoors.setText("");
- tEndBattleArmorDoors.setText("");
- tStartBattleArmorUnits.setText("");
- tEndBattleArmorUnits.setText("");
- tStartInfantryBays.setText("");
- tEndInfantryBays.setText("");
- tStartInfantryDoors.setText("");
- tEndInfantryDoors.setText("");
- tStartInfantryUnits.setText("");
- tEndInfantryUnits.setText("");
- tStartSuperHeavyVehicleBays.setText("");
- tEndSuperHeavyVehicleBays.setText("");
- tStartSuperHeavyVehicleDoors.setText("");
- tEndSuperHeavyVehicleDoors.setText("");
- tStartSuperHeavyVehicleUnits.setText("");
- tEndSuperHeavyVehicleUnits.setText("");
- tStartDropshuttleBays.setText("");
- tEndDropshuttleBays.setText("");
- tStartDropshuttleDoors.setText("");
- tEndDropshuttleDoors.setText("");
- tStartDropshuttleUnits.setText("");
- tEndDropshuttleUnits.setText("");
- tStartDockingCollars.setText("");
- tEndDockingCollars.setText("");
- tStartBattleArmorHandles.setText("");
- tEndBattleArmorHandles.setText("");
- tStartCargoBayUnits.setText("");
- tEndCargoBayUnits.setText("");
- tStartNavalRepairFacilities.setText("");
- tEndNavalRepairFacilities.setText("");
- }
-
- private void clearUnitType() {
- btnFilterMek.setText("\u2610");
- btnFilterBipedMek.setText("\u2610");
- btnFilterProtoMek.setText("\u2610");
- btnFilterLAM.setText("\u2610");
- btnFilterTripod.setText("\u2610");
- btnFilterQuad.setText("\u2610");
- btnFilterQuadVee.setText("\u2610");
- btnFilterAero.setText("\u2610");
- btnFilterFixedWingSupport.setText("\u2610");
- btnFilterConvFighter.setText("\u2610");
- btnFilterSmallCraft.setText("\u2610");
- btnFilterDropship.setText("\u2610");
- btnFilterJumpship.setText("\u2610");
- btnFilterWarship.setText("\u2610");
- btnFilterSpaceStation.setText("\u2610");
- btnFilterInfantry.setText("\u2610");
- btnFilterBattleArmor.setText("\u2610");
- btnFilterTank.setText("\u2610");
- btnFilterVTOL.setText("\u2610");
- btnFilterSupportVTOL.setText("\u2610");
- btnFilterGunEmplacement.setText("\u2610");
- btnFilterSupportTank.setText("\u2610");
- btnFilterLargeSupportTank.setText("\u2610");
- btnFilterSuperHeavyTank.setText("\u2610");
- btnFilterOmni.setText("\u2610");
- btnFilterMilitary.setText("\u2610");
- btnFilterIndustrial.setText("\u2610");
- btnFilterMountedInfantry.setText("\u2610");
- btnFilterWaterOnly.setText("\u2610");
- btnFilterSupportVehicle.setText("\u2610");
- btnFilterAerospaceFighter.setText("\u2610");
- btnFilterDoomedOnGround.setText("\u2610");
- btnFilterDoomedInAtmosphere.setText("\u2610");
- btnFilterDoomedInSpace.setText("\u2610");
- btnFilterDoomedInExtremeTemp.setText("\u2610");
- btnFilterDoomedInVacuum.setText("\u2610");
- }
-
- private void clearQuirks() {
- cQuirkInclue.setSelectedIndex(0);
- cQuirkExclude.setSelectedIndex(1);
- clearTriStateItem(listQuirkType);
-
- cWeaponQuirkInclue.setSelectedIndex(0);
- cWeaponQuirkExclude.setSelectedIndex(1);
- clearTriStateItem(listWeaponQuirkType);
- }
-
- private void clearWeaponsEquipment() {
- filterToks.clear();
- tblWeapons.clearSelection();
- tblEquipment.clearSelection();
- txtWEEqExp.setText("");
- btnWEBack.setEnabled(false);
- disableOperationButtons();
- enableSelectionButtons();
- }
-
- /**
- * Clear the filter.
- */
- public void clearValues() {
- mekFilter = null;
-
- clearUnitType();
- clearBase();
- clearTransports();
- clearQuirks();
- clearWeaponsEquipment();
- }
-
- /**
- * Creates collections for all the possible WeaponType
s and
- * EquipmentType
s. These are used to populate the weapons
- * and equipment tables.
- */
- private void populateWeaponsAndEquipmentChoices() {
- Vector weapons = new Vector<>();
- Vector equipment = new Vector<>();
-
- for (Enumeration e = EquipmentType.getAllTypes(); e.hasMoreElements();) {
- EquipmentType et = e.nextElement();
- if (et instanceof WeaponType) {
- weapons.add((WeaponType) et);
- // Check for C3+Tag and C3 Master Booster
- if (et.hasFlag(WeaponType.F_C3M) || et.hasFlag(WeaponType.F_C3MBS)) {
- equipment.add(et);
- }
- } else if (et instanceof MiscType) {
- equipment.add(et);
- }
- }
- weaponsModel.setData(weapons);
- equipmentModel.setData(equipment);
- }
-
- public MekSearchFilter getMekSearchFilter() {
- return mekFilter;
- }
-
- private void updateTriStateItemString(List include, List exclude, JList l) {
- ListModel m = l.getModel();
-
- for (int i = 0; i < m.getSize(); i++) {
- TriStateItem ms = m.getElementAt(i);
- if (ms.state.contains("\u2611")) {
- include.add(ms.text);
- } else if (ms.state.contains("\u2612")) {
- exclude.add(ms.text);
- }
- }
- }
-
- private void updateTriStateItem(List include, List exclude, JList l) {
- ListModel m = l.getModel();
-
- for (int i = 0; i < m.getSize(); i++) {
- TriStateItem ms = m.getElementAt(i);
- if (ms.state.contains("\u2611")) {
- include.add(ms.code);
-
- } else if (ms.state.contains("\u2612")) {
- exclude.add(ms.code);
- }
- }
- }
-
- private void updateBase() {
- mekFilter.sStartWalk = tStartWalk.getText();
- mekFilter.sEndWalk = tEndWalk.getText();
-
- mekFilter.sStartJump = tStartJump.getText();
- mekFilter.sEndJump = tEndJump.getText();
-
- mekFilter.iArmor = cArmor.getSelectedIndex();
-
- mekFilter.sStartTankTurrets = tStartTankTurrets.getText();
- mekFilter.sEndTankTurrets = tEndTankTurrets.getText();
- mekFilter.sStartLowerArms = tStartLowerArms.getText();
- mekFilter.sEndLowerArms = tEndLowerArms.getText();
- mekFilter.sStartHands = tStartHands.getText();
- mekFilter.sEndHands = tEndHands.getText();
-
- mekFilter.iOfficial = cOfficial.getSelectedIndex();
- mekFilter.iCanon = cCanon.getSelectedIndex();
- mekFilter.iInvalid = cInvalid.getSelectedIndex();
- mekFilter.iFailedToLoadEquipment = cFailedToLoadEquipment.getSelectedIndex();
- mekFilter.iClanEngine = cClanEngine.getSelectedIndex();
- mekFilter.iPatchwork = cPatchwork.getSelectedIndex();
-
- mekFilter.source = tSource.getText();
- mekFilter.mulid = tMULId.getText();
-
- mekFilter.sStartYear = tStartYear.getText();
- mekFilter.sEndYear = tEndYear.getText();
-
- mekFilter.sStartTons = tStartTons.getText();
- mekFilter.sEndTons = tEndTons.getText();
-
- mekFilter.sStartBV = tStartBV.getText();
- mekFilter.sEndBV = tEndBV.getText();
-
- updateTriStateItem(mekFilter.armorType, mekFilter.armorTypeExclude, listArmorType);
- updateTriStateItem(mekFilter.cockpitType, mekFilter.cockpitTypeExclude, listCockpitType);
- updateTriStateItem(mekFilter.internalsType, mekFilter.internalsTypeExclude, listInternalsType);
- updateTriStateItem(mekFilter.engineType, mekFilter.engineTypeExclude, listEngineType);
- updateTriStateItem(mekFilter.gyroType, mekFilter.gyroTypeExclude, listGyroType);
- updateTriStateItem(mekFilter.techLevel, mekFilter.techLevelExclude, listTechLevel);
- updateTriStateItemString(mekFilter.techBase, mekFilter.techBaseExclude, listTechBase);
- }
-
- private void updateTransports() {
- mekFilter.sStartTroopSpace = tStartTroopSpace.getText();
- mekFilter.sEndTroopSpace = tEndTroopSpace.getText();
-
- mekFilter.sStartASFBays = tStartASFBays.getText();
- mekFilter.sEndASFBays = tEndASFBays.getText();
- mekFilter.sStartASFDoors = tStartASFDoors.getText();
- mekFilter.sEndASFDoors = tEndASFDoors.getText();
- mekFilter.sStartASFUnits = tStartASFUnits.getText();
- mekFilter.sEndASFUnits = tEndASFUnits.getText();
-
- mekFilter.sStartSmallCraftBays = tStartSmallCraftBays.getText();
- mekFilter.sEndSmallCraftBays = tEndSmallCraftBays.getText();
- mekFilter.sStartSmallCraftDoors = tStartSmallCraftDoors.getText();
- mekFilter.sEndSmallCraftDoors = tEndSmallCraftDoors.getText();
- mekFilter.sStartSmallCraftUnits = tStartSmallCraftUnits.getText();
- mekFilter.sEndSmallCraftUnits = tEndSmallCraftUnits.getText();
-
- mekFilter.sStartMekBays = tStartMekBays.getText();
- mekFilter.sEndMekBays = tEndMekBays.getText();
- mekFilter.sStartMekDoors = tStartMekDoors.getText();
- mekFilter.sEndMekDoors = tEndMekDoors.getText();
- mekFilter.sStartMekUnits = tStartMekUnits.getText();
- mekFilter.sEndMekUnits = tEndMekUnits.getText();
-
- mekFilter.sStartHeavyVehicleBays = tStartHeavyVehicleBays.getText();
- mekFilter.sEndHeavyVehicleBays = tEndHeavyVehicleBays.getText();
- mekFilter.sStartHeavyVehicleDoors = tStartHeavyVehicleDoors.getText();
- mekFilter.sEndHeavyVehicleDoors = tEndHeavyVehicleDoors.getText();
- mekFilter.sStartHeavyVehicleUnits = tStartHeavyVehicleUnits.getText();
- mekFilter.sEndHeavyVehicleUnits = tEndHeavyVehicleUnits.getText();
-
- mekFilter.sStartLightVehicleBays = tStartLightVehicleBays.getText();
- mekFilter.sEndLightVehicleBays = tEndLightVehicleBays.getText();
- mekFilter.sStartLightVehicleDoors = tStartLightVehicleDoors.getText();
- mekFilter.sEndLightVehicleDoors = tEndLightVehicleDoors.getText();
- mekFilter.sStartLightVehicleUnits = tStartLightVehicleUnits.getText();
- mekFilter.sEndLightVehicleUnits = tEndLightVehicleUnits.getText();
-
- mekFilter.sStartProtomekBays = tStartProtomekBays.getText();
- mekFilter.sEndProtomekBays = tEndProtomekBays.getText();
- mekFilter.sStartProtomekDoors = tStartProtomekDoors.getText();
- mekFilter.sEndProtomekDoors = tEndProtomekDoors.getText();
- mekFilter.sStartProtomekUnits = tStartProtomekUnits.getText();
- mekFilter.sEndProtomekUnits = tEndProtomekUnits.getText();
-
- mekFilter.sStartBattleArmorBays = tStartBattleArmorBays.getText();
- mekFilter.sEndBattleArmorBays = tEndBattleArmorBays.getText();
- mekFilter.sStartBattleArmorDoors = tStartBattleArmorDoors.getText();
- mekFilter.sEndBattleArmorDoors = tEndBattleArmorDoors.getText();
- mekFilter.sStartBattleArmorUnits = tStartBattleArmorUnits.getText();
- mekFilter.sEndBattleArmorUnits = tEndBattleArmorUnits.getText();
-
- mekFilter.sStartInfantryBays = tStartInfantryBays.getText();
- mekFilter.sEndInfantryBays = tEndInfantryBays.getText();
- mekFilter.sStartInfantryDoors = tStartInfantryDoors.getText();
- mekFilter.sEndInfantryDoors = tEndInfantryDoors.getText();
- mekFilter.sStartInfantryUnits = tStartInfantryUnits.getText();
- mekFilter.sEndInfantryUnits = tEndInfantryUnits.getText();
-
- mekFilter.sStartSuperHeavyVehicleBays = tStartSuperHeavyVehicleBays.getText();
- mekFilter.sEndSuperHeavyVehicleBays = tEndSuperHeavyVehicleBays.getText();
- mekFilter.sStartSuperHeavyVehicleDoors = tStartSuperHeavyVehicleDoors.getText();
- mekFilter.sEndSuperHeavyVehicleDoors = tEndSuperHeavyVehicleDoors.getText();
- mekFilter.sStartSuperHeavyVehicleUnits = tStartSuperHeavyVehicleUnits.getText();
- mekFilter.sEndSuperHeavyVehicleUnits = tEndSuperHeavyVehicleUnits.getText();
-
- mekFilter.sStartDropshuttleBays = tStartDropshuttleBays.getText();
- mekFilter.sEndDropshuttleBays = tEndDropshuttleBays.getText();
- mekFilter.sStartDropshuttleDoors = tStartDropshuttleDoors.getText();
- mekFilter.sEndDropshuttleDoors = tEndDropshuttleDoors.getText();
- mekFilter.sStartDropshuttleUnits = tStartDropshuttleUnits.getText();
- mekFilter.sEndDropshuttleUnits = tEndDropshuttleUnits.getText();
-
- mekFilter.sStartDockingCollars = tStartDockingCollars.getText();
- mekFilter.sEndDockingCollars = tEndDockingCollars.getText();
-
- mekFilter.sStartBattleArmorHandles = tStartBattleArmorHandles.getText();
- mekFilter.sEndBattleArmorHandles = tEndBattleArmorHandles.getText();
-
- mekFilter.sStartCargoBayUnits = tStartCargoBayUnits.getText();
- mekFilter.sEndCargoBayUnits = tEndCargoBayUnits.getText();
-
- mekFilter.sStartNavalRepairFacilities = tStartNavalRepairFacilities.getText();
- mekFilter.sEndNavalRepairFacilities = tEndNavalRepairFacilities.getText();
- }
-
- private void updateQuirks() {
- mekFilter.quirkInclude = cQuirkInclue.getSelectedIndex();
- mekFilter.quirkExclude = cQuirkExclude.getSelectedIndex();
-
- updateTriStateItemString(mekFilter.quirkType, mekFilter.quirkTypeExclude, listQuirkType);
-
- mekFilter.weaponQuirkInclude = cWeaponQuirkInclue.getSelectedIndex();
- mekFilter.weaponQuirkExclude = cWeaponQuirkExclude.getSelectedIndex();
-
- updateTriStateItemString(mekFilter.weaponQuirkType, mekFilter.weaponQuirkTypeExclude, listWeaponQuirkType);
- }
-
- private void updateUnitTypes() {
- mekFilter.filterMek = getValue(btnFilterMek);
- mekFilter.filterBipedMek = getValue(btnFilterBipedMek);
- mekFilter.filterProtomek = getValue(btnFilterProtoMek);
- mekFilter.filterLAM = getValue(btnFilterLAM);
- mekFilter.filterTripod = getValue(btnFilterTripod);
- mekFilter.filterQuad = getValue(btnFilterQuad);
- mekFilter.filterQuadVee = getValue(btnFilterQuadVee);
- mekFilter.filterAero = getValue(btnFilterAero);
- mekFilter.filterFixedWingSupport = getValue(btnFilterFixedWingSupport);
- mekFilter.filterConvFighter = getValue(btnFilterConvFighter);
- mekFilter.filterSmallCraft = getValue(btnFilterSmallCraft);
- mekFilter.filterDropship = getValue(btnFilterDropship);
- mekFilter.filterJumpship = getValue(btnFilterJumpship);
- mekFilter.filterWarship = getValue(btnFilterWarship);
- mekFilter.filterSpaceStation = getValue(btnFilterSpaceStation);
- mekFilter.filterInfantry = getValue(btnFilterInfantry);
- mekFilter.filterBattleArmor = getValue(btnFilterBattleArmor);
- mekFilter.filterTank = getValue(btnFilterTank);
- mekFilter.filterVTOL = getValue(btnFilterVTOL);
- mekFilter.filterSupportVTOL = getValue(btnFilterSupportVTOL);
- mekFilter.filterGunEmplacement = getValue(btnFilterGunEmplacement);
- mekFilter.filterSupportTank = getValue(btnFilterSupportTank);
- mekFilter.filterLargeSupportTank = getValue(btnFilterLargeSupportTank);
- mekFilter.filterSuperHeavyTank = getValue(btnFilterSuperHeavyTank);
- mekFilter.iOmni = getValue(btnFilterOmni);
- mekFilter.iMilitary = getValue(btnFilterMilitary);
- mekFilter.iIndustrial = getValue(btnFilterIndustrial);
- mekFilter.iMountedInfantry = getValue(btnFilterMountedInfantry);
- mekFilter.iWaterOnly = getValue(btnFilterWaterOnly);
- mekFilter.iSupportVehicle = getValue(btnFilterSupportVehicle);
- mekFilter.iAerospaceFighter = getValue(btnFilterAerospaceFighter);
- mekFilter.iDoomedOnGround = getValue(btnFilterDoomedOnGround);
- mekFilter.iDoomedInAtmosphere = getValue(btnFilterDoomedInAtmosphere);
- mekFilter.iDoomedInSpace = getValue(btnFilterDoomedInSpace);
- mekFilter.iDoomedInExtremeTemp = getValue(btnFilterDoomedInExtremeTemp);
- mekFilter.iDoomedInVacuum = getValue(btnFilterDoomedInVacuum);
- }
-
- /**
- * Update the search fields that aren't automatically updated.
- */
- protected void updateMekSearchFilter() {
- mekFilter.isDisabled = false;
-
- updateBase();
- updateTransports();
- updateQuirks();
- updateUnitTypes();
- }
-
- public int getValue(JButton b) {
- if (b.getText().equals("\u2610")) {
- return 0;
- } else if (b.getText().equals("\u2611")) {
- return 1;
- } else if (b.getText().equals("\u2612")) {
- return 2;
- } else {
- return -1;
- }
- }
-
- public class WeaponClassTableModel extends AbstractTableModel {
- private static final long serialVersionUID = 1L;
-
- private static final int COL_QTY = 0;
- private static final int COL_NAME = 1;
- private static final int N_COL = 2;
- private static final int COL_VAL = 2;
-
-
- private int[] qty;
-
- private Vector weaponClasses = new Vector<>();
-
- public WeaponClassTableModel() {
- for (WeaponClass cl : WeaponClass.values())
- {
- weaponClasses.add(cl);
- }
- qty = new int[weaponClasses.size()];
- Arrays.fill(qty, 1);
- }
-
- @Override
- public int getRowCount() {
- return weaponClasses.size();
- }
-
- @Override
- public int getColumnCount() {
- return N_COL;
- }
-
- public int getPreferredWidth(int col) {
- switch (col) {
- case COL_QTY:
- return 40;
- case COL_NAME:
- return 310;
- default:
- return 0;
- }
- }
-
- @Override
- public String getColumnName(int column) {
- switch (column) {
- case COL_QTY:
- return "Qty";
- case COL_NAME:
- return "Weapon Class";
- default:
- return "?";
- }
- }
-
- @Override
- public Class> getColumnClass(int c) {
- return getValueAt(0, c).getClass();
- }
-
- @Override
- public boolean isCellEditable(int row, int col) {
- switch (col) {
- case COL_QTY:
- return true;
- default:
- return false;
- }
- }
-
- // fill table with values
- // public void setData(Vector wps) {
- // weaponClasses = wps;
- // qty = new int[wps.size()];
- // Arrays.fill(qty, 1);
- // fireTableDataChanged();
- // }
-
- public WeaponClass getWeaponTypeAt(int row) {
- return weaponClasses.elementAt(row);
- }
-
- @Override
- public Object getValueAt(int row, int col) {
- if (row >= weaponClasses.size()) {
- return null;
- }
-
- switch (col) {
- case COL_QTY:
- return qty[row] + "";
- case COL_NAME:
- return weaponClasses.elementAt(row).toString();
- case COL_VAL:
- return weaponClasses.elementAt(row);
- default:
- return "?";
- }
- }
-
- @Override
- public void setValueAt(Object value, int row, int col) {
- switch (col) {
- case COL_QTY:
- qty[row] = Integer.parseInt((String) value);
- fireTableCellUpdated(row, col);
- break;
- default:
- break;
- }
- }
-
- }
-
-
- /**
- * A table model for displaying weapons
- */
- public class WeaponsTableModel extends AbstractTableModel {
-
- private static final int COL_QTY = 0;
- private static final int COL_NAME = 1;
- private static final int COL_DMG = 2;
- private static final int COL_HEAT = 3;
- private static final int COL_SHORT = 4;
- private static final int COL_MED = 5;
- private static final int COL_LONG = 6;
- private static final int COL_IS_CLAN = 7;
- private static final int COL_LEVEL = 8;
- private static final int N_COL = 9;
- private static final int COL_INTERNAL_NAME = 9;
-
- private int[] qty;
-
- private Vector weapons = new Vector<>();
-
- @Override
- public int getRowCount() {
- return weapons.size();
- }
-
- @Override
- public int getColumnCount() {
- return N_COL;
- }
-
- public int getPreferredWidth(int col) {
- switch (col) {
- case COL_QTY:
- return 40;
- case COL_NAME:
- return 310;
- case COL_IS_CLAN:
- return 75;
- case COL_DMG:
- return 50;
- case COL_HEAT:
- return 50;
- case COL_SHORT:
- return 50;
- case COL_MED:
- return 50;
- case COL_LONG:
- return 50;
- case COL_LEVEL:
- return 100;
- default:
- return 0;
- }
- }
-
- @Override
- public String getColumnName(int column) {
- switch (column) {
- case COL_QTY:
- return "Qty";
- case COL_NAME:
- return "Weapon Name";
- case COL_IS_CLAN:
- return "IS/Clan";
- case COL_DMG:
- return "DMG";
- case COL_HEAT:
- return "Heat";
- case COL_SHORT:
- return "Short";
- case COL_MED:
- return "Med";
- case COL_LONG:
- return "Long";
- case COL_LEVEL:
- return "Lvl";
- default:
- return "?";
- }
- }
-
- @Override
- public Class> getColumnClass(int c) {
- return getValueAt(0, c).getClass();
- }
-
- @Override
- public boolean isCellEditable(int row, int col) {
- switch (col) {
- case COL_QTY:
- return true;
- default:
- return false;
- }
- }
-
- // fill table with values
- public void setData(Vector wps) {
- weapons = wps;
- qty = new int[wps.size()];
- Arrays.fill(qty, 1);
- fireTableDataChanged();
- }
-
- public WeaponType getWeaponTypeAt(int row) {
- return weapons.elementAt(row);
- }
-
- @Override
- public Object getValueAt(int row, int col) {
- if (row >= weapons.size()) {
- return null;
- }
- WeaponType wp = weapons.elementAt(row);
- switch (col) {
- case COL_QTY:
- return qty[row] + "";
- case COL_NAME:
- return wp.getName();
- case COL_IS_CLAN:
- return TechConstants.getTechName(wp.getTechLevel(gameYear));
- case COL_DMG:
- return wp.getDamage();
- case COL_HEAT:
- return wp.getHeat();
- case COL_SHORT:
- return wp.getShortRange();
- case COL_MED:
- return wp.getMediumRange();
- case COL_LONG:
- return wp.getLongRange();
- case COL_LEVEL:
- return TechConstants.getSimpleLevelName(TechConstants
- .convertFromNormalToSimple(wp
- .getTechLevel(gameYear)));
- case COL_INTERNAL_NAME:
- return wp.getInternalName();
- default:
- return "?";
- }
- }
-
- @Override
- public void setValueAt(Object value, int row, int col) {
- switch (col) {
- case COL_QTY:
- qty[row] = Integer.parseInt((String) value);
- fireTableCellUpdated(row, col);
- break;
- default:
- break;
- }
- }
-
- }
-
- /**
- * A table model for displaying equipment
- */
- public class EquipmentTableModel extends AbstractTableModel {
-
- private static final int COL_QTY = 0;
- private static final int COL_NAME = 1;
- private static final int COL_COST = 2;
- private static final int COL_IS_CLAN = 3;
- private static final int COL_LEVEL = 4;
- private static final int N_COL = 5;
- private static final int COL_INTERNAL_NAME = 5;
-
- private int[] qty;
- private Vector equipment = new Vector<>();
-
- @Override
- public int getRowCount() {
- return equipment.size();
- }
-
- @Override
- public int getColumnCount() {
- return N_COL;
- }
-
- public int getPreferredWidth(int col) {
- switch (col) {
- case COL_QTY:
- return 40;
- case COL_NAME:
- return 400;
- case COL_IS_CLAN:
- return 75;
- case COL_COST:
- return 175;
- case COL_LEVEL:
- return 100;
- default:
- return 0;
- }
- }
-
- @Override
- public String getColumnName(int column) {
- switch (column) {
- case COL_QTY:
- return "Qty";
- case COL_NAME:
- return "Name";
- case COL_IS_CLAN:
- return "IS/Clan";
- case COL_COST:
- return "Cost";
- case COL_LEVEL:
- return "Lvl";
- default:
- return "?";
- }
- }
-
- @Override
- public Class> getColumnClass(int c) {
- return getValueAt(0, c).getClass();
- }
-
- @Override
- public boolean isCellEditable(int row, int col) {
- switch (col) {
- case COL_QTY:
- return true;
- default:
- return false;
- }
- }
-
- // fill table with values
- public void setData(Vector eq) {
- equipment = eq;
- qty = new int[eq.size()];
- Arrays.fill(qty, 1);
- fireTableDataChanged();
- }
-
- public EquipmentType getEquipmentTypeAt(int row) {
- return equipment.elementAt(row);
- }
-
- @Override
- public Object getValueAt(int row, int col) {
- if (row >= equipment.size()) {
- return null;
- }
- EquipmentType eq = equipment.elementAt(row);
- switch (col) {
- case COL_QTY:
- return qty[row] + "";
- case COL_NAME:
- return eq.getName();
- case COL_IS_CLAN:
- return TechConstants.getTechName(eq.getTechLevel(gameYear));
- case COL_COST:
- return eq.getRawCost();
- case COL_LEVEL:
- return TechConstants.getSimpleLevelName(TechConstants
- .convertFromNormalToSimple(eq
- .getTechLevel(gameYear)));
- case COL_INTERNAL_NAME:
- return eq.getInternalName();
- default:
- return "?";
- }
- }
-
- @Override
- public void setValueAt(Object value, int row, int col) {
- switch (col) {
- case COL_QTY:
- qty[row] = Integer.parseInt((String) value);
- fireTableCellUpdated(row, col);
- break;
- default:
- break;
- }
- }
- }
-
- @Override
- public void keyPressed(KeyEvent evt) {
-
- }
-
- @Override
- public void keyReleased(KeyEvent evt) {
-
- }
-
- @Override
- public void keyTyped(KeyEvent evt) {
- char keyChar = evt.getKeyChar();
- // Ensure we've got a number or letter pressed
- if (!(((keyChar >= '0') && (keyChar <= '9')) ||
- ((keyChar >= 'a') && (keyChar <='z')) || (keyChar == ' '))) {
- return;
- }
-
- if (evt.getComponent().equals(tblWeapons)) {
- tblWeapons.keyTyped(evt);
- } else if (evt.getComponent().equals(tblEquipment)) {
- tblEquipment.keyTyped(evt);
- }
- }
-
-
- /**
- * Base class for different tokens that can be in a filter expression.
- * @author Arlith
- */
- public static class FilterTokens {
-
- }
-
- /**
- * FilterTokens subclass that represents parenthesis.
- * @author Arlith
- */
- public static class ParensFT extends FilterTokens {
- public String parens;
-
- public ParensFT(String p) {
- parens = p;
- }
-
- @Override
- public String toString() {
- return parens;
- }
- }
-
- /**
- * FilterTokens subclass that represents equipment.
- * @author Arlith
- */
- public static class EquipmentFT extends FilterTokens {
- public String internalName;
- public String fullName;
- public int qty;
-
- public EquipmentFT(String in, String fn, int q) {
- internalName = in;
- fullName = fn;
- qty = q;
- }
-
- @Override
- public String toString() {
- return qty + " " + fullName + ((qty != 1) ? "s" : "");
- }
- }
-
- /**
- * FilterTokens subclass that represents a boolean operation.
- * @author Arlith
- */
- public static class OperationFT extends FilterTokens {
- public MekSearchFilter.BoolOp op;
-
- public OperationFT(MekSearchFilter.BoolOp o) {
- op = o;
- }
-
- @Override
- public String toString() {
- if (op == MekSearchFilter.BoolOp.AND) {
- return "And";
- } else if (op == MekSearchFilter.BoolOp.OR) {
- return "Or";
- } else {
- return "";
- }
- }
- }
-
- public class WeaponClassFT extends FilterTokens {
- public WeaponClass weaponClass;
- public int qty;
-
- public WeaponClassFT(WeaponClass in_class, int in_qty) {
- weaponClass = in_class;
- qty = in_qty;
- }
-
- @Override
- public String toString() {
- if (qty == 1) {
- return qty + " " + weaponClass.toString();
- } else {
- return qty + " " + weaponClass.toString() + "s";
- }
- }
- }
-
- public static enum WeaponClass {
- AUTOCANNON {
- public String toString() {
- return "Autocannon";
- }
- },
- RAC,
- ULTRA {
- public String toString() {
- return "Ultra A/C";
- }
- },
- LIGHT {
- public String toString() {
- return "Light A/C";
- }
- },
- MACHINE_GUN {
- public String toString() {
- return "Machine Gun";
- }
- },
- GAUSS {
- public String toString() {
- return "Gauss";
- }
- },
- BALLISTIC {
- public String toString() {
- return "Ballistic";
- }
- },
- PLASMA {
- public String toString() {
- return "Plasma";
- }
- },
- ENERGY {
- public String toString() {
- return "Energy";
- }
- },
- LASER {
- public String toString() {
- return "Laser";
- }
- },
- PULSE {
- public String toString() {
- return "Pulse Laser";
- }
- },
- RE_ENGINEERED {
- public String toString() {
- return "Re-Engineered Laser";
- }
- },
- PPC {
- public String toString() {
- return "PPC";
- }
- },
- TASER {
- public String toString() {
- return "Taser";
- }
- },
- FLAMER {
- public String toString() {
- return "Flamer";
- }
- },
- MISSILE {
- public String toString() {
- return "Missile";
- }
- },
- LRM,
- MRM,
- SRM,
- PHYSICAL {
- public String toString() {
- return "Physical (inc. industrial equipment)";
- }
- },
- AMS,
- PRACTICAL_PHYSICAL {
- public String toString() {
- return "Physical (weapons only)";
- }
- };
-
- public boolean matches(String name) {
- if (name.toLowerCase().contains("ammo")) {
- return false;
- }
- if (this == PHYSICAL) {
- String lName = name.toLowerCase();
-
- if (lName.contains("backhoe") ||
- lName.contains("saw") ||
- lName.contains("whip") ||
- lName.contains("claw") ||
- lName.contains("combine") ||
- lName.contains("flail") ||
- lName.contains("hatchet") ||
- lName.contains("driver") ||
- lName.contains("lance") ||
- lName.contains("mace") ||
- lName.contains("drill") ||
- lName.contains("ram") ||
- lName.contains("blade") ||
- lName.contains("cutter") ||
- lName.contains("shield") ||
- lName.contains("welder") ||
- lName.contains("sword") ||
- lName.contains("talons") ||
- lName.contains("wrecking")) {
- return true;
- }
- } else if (this == PRACTICAL_PHYSICAL) {
- String lName = name.toLowerCase();
-
- if (lName.contains("claw") ||
- lName.contains("flail") ||
- lName.contains("hatchet") ||
- lName.contains("lance") ||
- lName.contains("mace") ||
- lName.contains("blade") ||
- lName.contains("shield") ||
- lName.contains("sword") ||
- lName.contains("talons")) {
- return true;
- }
- } else if (this == MISSILE) {
- if ((name.toLowerCase().contains("lrm") ||
- name.toLowerCase().contains("mrm") ||
- name.toLowerCase().contains("srm")) &&
- !name.toLowerCase().contains("ammo")) {
- return true;
- }
- } else if (this == RE_ENGINEERED) {
- if (name.toLowerCase().contains("engineered")) {
- return true;
- }
- } else if (this == ENERGY) {
- if (WeaponClass.LASER.matches(name) || WeaponClass.PPC.matches(name) || WeaponClass.FLAMER.matches(name)) {
- return true;
- }
- } else if (this == MACHINE_GUN) {
- if ((name.toLowerCase().contains("mg") || name.toLowerCase().contains("machine")) && !name.toLowerCase().contains("ammo")) {
- return true;
- }
- } else if (this == BALLISTIC) {
- return WeaponClass.AUTOCANNON.matches(name) ||
- WeaponClass.GAUSS.matches(name) ||
- WeaponClass.MISSILE.matches(name) ||
- WeaponClass.MACHINE_GUN.matches(name);
- } else if (this == RAC) {
- if (name.toLowerCase().contains("rotary")) {
- return true;
- }
- } else if (this == ULTRA) {
- if (name.toLowerCase().contains("ultraa")) {
- return true;
- }
- } else if (name.toLowerCase().contains(this.name().toLowerCase()) && !name.toLowerCase().contains("ammo")) {
- return true;
- }
- return false;
- }
- }
-}
diff --git a/megamek/src/megamek/common/MekSearchFilter.java b/megamek/src/megamek/common/MekSearchFilter.java
index 0b29913723..073ac85774 100644
--- a/megamek/src/megamek/common/MekSearchFilter.java
+++ b/megamek/src/megamek/common/MekSearchFilter.java
@@ -21,11 +21,10 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import java.util.Vector;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
-import megamek.client.ui.swing.unitSelector.TWAdvancedSearchPanel;
+import megamek.client.ui.advancedsearch.*;
import megamek.common.util.StringUtil;
import megamek.logging.MMLogger;
@@ -232,8 +231,7 @@ public MekSearchFilter(MekSearchFilter sf) {
/**
* Creates an Expressiontree from a collection of tokens.
*/
- public void createFilterExpressionFromTokens(Vector toks)
- throws FilterParsingException {
+ public void createFilterExpressionFromTokens(List toks) throws FilterParsingException {
equipmentCriteria = new ExpressionTree();
if (!toks.isEmpty()) {
equipmentCriteria.root = createFTFromTokensRecursively(toks.iterator(), null);
@@ -243,25 +241,25 @@ public void createFilterExpressionFromTokens(Vector toks,
+ private ExpNode createFTFromTokensRecursively(Iterator toks,
ExpNode currNode) {
// Base case. We're out of tokens, so we're done.
if (!toks.hasNext()) {
return currNode;
}
- TWAdvancedSearchPanel.FilterTokens filterTok = toks.next();
+ FilterToken filterTok = toks.next();
// Parsing Parenthesis
- if (filterTok instanceof TWAdvancedSearchPanel.ParensFT) {
- if (((TWAdvancedSearchPanel.ParensFT) filterTok).parens.equals("(")) {
+ if (filterTok instanceof ParensFT) {
+ if (((ParensFT) filterTok).parens.equals("(")) {
if (currNode == null) {
return createFTFromTokensRecursively(toks, null);
} else {
currNode.children.add(createFTFromTokensRecursively(toks, null));
return currNode;
}
- } else if (((TWAdvancedSearchPanel.ParensFT) filterTok).parens.equals(")")) {
+ } else if (((ParensFT) filterTok).parens.equals(")")) {
ExpNode nextNode = createFTFromTokensRecursively(toks, null);
// This right paren is the end of the expression
if (nextNode == null) {
@@ -274,8 +272,8 @@ private ExpNode createFTFromTokensRecursively(Iterator children;
@@ -1170,7 +1168,7 @@ public ExpNode(String n, int q) {
children = new LinkedList<>();
}
- public ExpNode(TWAdvancedSearchPanel.WeaponClass n, int q) {
+ public ExpNode(WeaponClass n, int q) {
parent = null;
name = null;
weaponClass = n;
diff --git a/megamek/src/megamek/common/util/RandomArmyCreator.java b/megamek/src/megamek/common/util/RandomArmyCreator.java
index 280d8a1870..c3650f1d9f 100644
--- a/megamek/src/megamek/common/util/RandomArmyCreator.java
+++ b/megamek/src/megamek/common/util/RandomArmyCreator.java
@@ -19,7 +19,7 @@
import java.util.Comparator;
import java.util.List;
-import megamek.client.ui.swing.unitSelector.ASAdvancedSearchPanel;
+import megamek.client.ui.advancedsearch.ASAdvancedSearchPanel;
import megamek.common.Compute;
import megamek.common.MekSearchFilter;
import megamek.common.MekSummary;