/*
* Copyright (C) 2011 Thedeath<www.fseek.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 3 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.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package mpq;
import java.util.Comparator;
public class MpqArchiveComparator implements Comparator<ExtMpqArchive>
{
private boolean descending;
// strings how the names should be ordered: common 1st, 2nd expansion, 3rd lichking ....
private String[] searchStrings = {"common", "expansion", "lichking", "base", "locale", "speech", "patch"};
private String[] secondSearchStrings = {"locale", "speech", "enus"};
public MpqArchiveComparator(boolean descending)
{
this.descending = descending;
}
public MpqArchiveComparator()
{
this(false);
}
@Override
public int compare(ExtMpqArchive o1, ExtMpqArchive o2)
{
int mult = 1;
if(descending)
{
mult = -1;
}
String name1 = deleteExtension(o1.getArchiveFile().getName().toLowerCase());
String name2 = deleteExtension(o2.getArchiveFile().getName().toLowerCase());
return compare(name1, name2, searchStrings, mult);
}
private int compare(String name1, String name2, String[] searchString, int mult)
{
for(String s : searchString)
{
if(name1.contains(s) && !name2.contains(s))
{
return 1*mult;
}
if(name1.contains(s) && name2.contains(s))
{
String stringToNumber1 = getStringToNumber(name1);
String stringToNumber2 = getStringToNumber(name2);
if(stringToNumber1.equals(stringToNumber2))
{
return getNumberWorth(name1,name2, mult);
}
else
{
for(String second : secondSearchStrings)
{
if(name2.contains(second) && !name1.contains(second))
{
return 1*mult;
}
else if(name2.contains(second) && name1.contains(second))
{
return getNumberWorth(name1,name2, mult);
}
else if(!name2.contains(second) && name1.contains(second))
{
return -1*mult;
}
}
}
}
if(name2.contains(s) && !name1.contains(s))
{
return -1*mult;
}
}
return -1*mult;
}
private int getNumberWorth(String name1, String name2, int mult)
{
int numb1 = getEndNumber(name1);
int numb2 = getEndNumber(name2);
if(numb2 > numb1)
{
return 1*mult;
}
else if(numb1 == numb2)
{
return 0*mult;
}
else
{
return -1*mult;
}
}
private String deleteExtension(String s)
{
int lastIndexOf = s.lastIndexOf(".");
if(lastIndexOf != -1)
{
return s.substring(0, lastIndexOf);
}
return s;
}
private int getEndNumber(String s)
{
int lastIndexOf = s.lastIndexOf("-");
int number = 1;
if(lastIndexOf != -1)
{
String numb = s.substring(lastIndexOf+1, s.length());
try
{
number = Integer.parseInt(numb);
}catch(NumberFormatException ex){}
}
return number;
}
private String getStringToNumber(String s)
{
int lastIndexOf = s.lastIndexOf("-");
if(lastIndexOf != -1)
{
String numb = s.substring(lastIndexOf+1, s.length());
try
{
// this parse is only for that to check if String numb is really an Integer
int number = Integer.parseInt(numb);
s = s.substring(0, lastIndexOf);
}catch(NumberFormatException ex){}
}
return s;
}
}