/*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* For information about the authors of this project Have a look
* at the AUTHORS file in the root of this project.
*/
package net.sourceforge.fullsync.ui.filterrule;
import java.util.HashMap;
import java.util.Map;
import net.sourceforge.fullsync.SystemDate;
import net.sourceforge.fullsync.rules.filefilter.FileAgeFileFilterRule;
import net.sourceforge.fullsync.rules.filefilter.FileFilter;
import net.sourceforge.fullsync.rules.filefilter.FileFilterManager;
import net.sourceforge.fullsync.rules.filefilter.FileFilterRule;
import net.sourceforge.fullsync.rules.filefilter.FileModificationDateFileFilterRule;
import net.sourceforge.fullsync.rules.filefilter.FileNameFileFilterRule;
import net.sourceforge.fullsync.rules.filefilter.FilePathFileFilterRule;
import net.sourceforge.fullsync.rules.filefilter.FileSizeFileFilterRule;
import net.sourceforge.fullsync.rules.filefilter.FileTypeFileFilterRule;
import net.sourceforge.fullsync.rules.filefilter.SubfilterFileFilerRule;
import net.sourceforge.fullsync.rules.filefilter.values.AgeValue;
import net.sourceforge.fullsync.rules.filefilter.values.DateValue;
import net.sourceforge.fullsync.rules.filefilter.values.FilterValue;
import net.sourceforge.fullsync.rules.filefilter.values.OperandValue;
import net.sourceforge.fullsync.rules.filefilter.values.SizeValue;
import net.sourceforge.fullsync.rules.filefilter.values.TextValue;
import net.sourceforge.fullsync.rules.filefilter.values.TypeValue;
import net.sourceforge.fullsync.ui.FileFilterPage;
import net.sourceforge.fullsync.ui.GuiController;
import net.sourceforge.fullsync.ui.Messages;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
public class FilterRuleListItem {
private static final Map<String, Class<? extends FileFilterRule>> rulesTable;
private static final Map<String, String> ruleNamesConversionTable;
private static final Map<String, String> reverseRuleNamesConversionTable;
private static final String[] ruleTypeNames;
static {
final String name = Messages.getString("FilterRuleListItem.FileNameFilter");
final String path = Messages.getString("FilterRuleListItem.FilePathFilter");
final String type = Messages.getString("FilterRuleListItem.FileTypeFilter");
final String size = Messages.getString("FilterRuleListItem.FilSizeFilter");
final String modificationDate = Messages.getString("FilterRuleListItem.FileModificationDateFilter");
final String age = Messages.getString("FilterRuleListItem.FileAgeFilter");
final String nested = Messages.getString("FilterRuleListItem.NestedFilter");
ruleTypeNames = new String[] { name, path, type, size, modificationDate, age, nested };
rulesTable = new HashMap<String, Class<? extends FileFilterRule>>();
rulesTable.put(name, FileNameFileFilterRule.class);
rulesTable.put(path, FilePathFileFilterRule.class);
rulesTable.put(type, FileTypeFileFilterRule.class);
rulesTable.put(size, FileSizeFileFilterRule.class);
rulesTable.put(modificationDate, FileModificationDateFileFilterRule.class);
rulesTable.put(age, FileAgeFileFilterRule.class);
rulesTable.put(nested, SubfilterFileFilerRule.class);
ruleNamesConversionTable = new HashMap<String, String>();
ruleNamesConversionTable.put(FileNameFileFilterRule.TYPE_NAME, name);
ruleNamesConversionTable.put(FilePathFileFilterRule.TYPE_NAME, path);
ruleNamesConversionTable.put(FileTypeFileFilterRule.TYPE_NAME, type);
ruleNamesConversionTable.put(FileSizeFileFilterRule.TYPE_NAME, size);
ruleNamesConversionTable.put(FileModificationDateFileFilterRule.TYPE_NAME, modificationDate);
ruleNamesConversionTable.put(FileAgeFileFilterRule.TYPE_NAME, age);
ruleNamesConversionTable.put(SubfilterFileFilerRule.TYPE_NAME, nested);
reverseRuleNamesConversionTable = new HashMap<String, String>();
reverseRuleNamesConversionTable.put(name, FileNameFileFilterRule.TYPE_NAME);
reverseRuleNamesConversionTable.put(path, FilePathFileFilterRule.TYPE_NAME);
reverseRuleNamesConversionTable.put(type, FileTypeFileFilterRule.TYPE_NAME);
reverseRuleNamesConversionTable.put(size, FileSizeFileFilterRule.TYPE_NAME);
reverseRuleNamesConversionTable.put(modificationDate, FileModificationDateFileFilterRule.TYPE_NAME);
reverseRuleNamesConversionTable.put(age, FileAgeFileFilterRule.TYPE_NAME);
reverseRuleNamesConversionTable.put(nested, SubfilterFileFilerRule.TYPE_NAME);
}
private String ruleType;
private int op;
private OperandValue value;
private RuleComposite ruleComposite;
private final FileFilterPage root;
private final FileFilterManager fileFilterManager;
public FilterRuleListItem(FileFilterPage root, Composite composite, FileFilterManager fileFilterManager, String ruleType, int op,
OperandValue value) {
this.fileFilterManager = fileFilterManager;
this.ruleType = ruleType;
this.op = op;
this.root = root;
this.value = value;
init(composite);
}
private static Class<? extends FileFilterRule> getRuleClass(String typeName) {
return rulesTable.get(ruleNamesConversionTable.get(typeName));
}
private static String getRuleTypeName(String guiName) {
return reverseRuleNamesConversionTable.get(guiName);
}
private static String getRuleGUIName(String typeName) {
return ruleNamesConversionTable.get(typeName);
}
public String getRuleType() {
return ruleType;
}
public int getOperator() {
return op;
}
public OperandValue getValue() {
return value;
}
public void init(final Composite composite) {
final FilterRuleListItem ruleItem = this;
final Combo comboRuleTypes = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
comboRuleTypes.addListener(SWT.Selection, e -> {
ruleType = getRuleTypeName(comboRuleTypes.getText());
root.recreateRuleList();
});
comboRuleTypes.removeAll();
for (String ruleTypeName : ruleTypeNames) {
comboRuleTypes.add(ruleTypeName);
}
if ((ruleType == null) || ("".equals(ruleType))) { //$NON-NLS-1$
comboRuleTypes.select(0);
ruleType = getRuleTypeName(comboRuleTypes.getText());
}
else {
comboRuleTypes.setText(getRuleGUIName(ruleType));
}
Class<? extends FileFilterRule> ruleClass = getRuleClass(ruleType);
Combo comboOperators = null;
if (!ruleClass.equals(SubfilterFileFilerRule.class)) {
comboOperators = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
comboOperators.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
final Combo comboOp = comboOperators;
comboOperators.addListener(SWT.Selection, e -> {
op = comboOp.getSelectionIndex();
comboOp.getParent().layout();
});
}
if (!ruleClass.equals(SubfilterFileFilerRule.class)) {
String[] ops = fileFilterManager.getOperatorsForRuleType(ruleType);
comboOperators.removeAll();
for (String op2 : ops) {
comboOperators.add(op2);
}
if ((op < 0) || (op >= comboOperators.getItemCount())) {
op = 0;
}
comboOperators.select(op);
if (ops.length == 0) {
comboOperators.setVisible(false);
}
}
if ((ruleClass.equals(FileNameFileFilterRule.class)) || (ruleClass.equals(FilePathFileFilterRule.class))) {
if (!(value instanceof TextValue)) {
value = new TextValue();
}
ruleComposite = new TextValueRuleComposite(composite, SWT.NULL, (TextValue) value);
}
else if (ruleClass.equals(FileTypeFileFilterRule.class)) {
if (!(value instanceof TypeValue)) {
value = new TypeValue();
}
ruleComposite = new TypeValueRuleComposite(composite, SWT.NULL, (TypeValue) value);
}
else if (ruleClass.equals(FileSizeFileFilterRule.class)) {
if (!(value instanceof SizeValue)) {
value = new SizeValue();
}
ruleComposite = new SizeValueRuleComposite(composite, SWT.NULL, (SizeValue) value);
}
else if (ruleClass.equals(FileAgeFileFilterRule.class)) {
if (!(value instanceof AgeValue)) {
value = new AgeValue();
}
ruleComposite = new AgeValueRuleComposite(composite, SWT.NULL, (AgeValue) value);
}
else if (ruleClass.equals(FileModificationDateFileFilterRule.class)) {
if (!(value instanceof DateValue)) {
value = new DateValue(SystemDate.getInstance().currentTimeMillis());
}
ruleComposite = new DateValueRuleComposite(composite, SWT.NULL, (DateValue) value);
}
else if (ruleClass.equals(SubfilterFileFilerRule.class)) {
if (!(value instanceof FilterValue)) {
value = new FilterValue(new FileFilter());
}
ruleComposite = new SubfilterRuleComposite(composite, SWT.NULL, (FilterValue) value);
}
else {
Composite valueComposite = new Composite(composite, SWT.NULL);
Text textValue = new Text(valueComposite, SWT.BORDER);
textValue.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
textValue.setText("Missing Rule Composite");
textValue.setEditable(false);
}
if (null != ruleComposite) {
ruleComposite.addValueChangedListener(e -> value = e.getValue());
}
ToolBar toolBar = new ToolBar(composite, SWT.FLAT);
ToolItem toolItemDelete = new ToolItem(toolBar, SWT.PUSH);
toolItemDelete.setImage(GuiController.getInstance().getImage("Rule_Delete.png")); //$NON-NLS-1$
toolItemDelete.setToolTipText(Messages.getString("FilterRuleListItem.Delete")); //$NON-NLS-1$
toolItemDelete.addListener(SWT.Selection, e -> root.deleteRule(ruleItem));
ToolItem toolItemAdd = new ToolItem(toolBar, SWT.PUSH);
toolItemAdd.setImage(GuiController.getInstance().getImage("Rule_Add.png")); //$NON-NLS-1$
toolItemAdd.setToolTipText(Messages.getString("FilterRuleListItem.Add")); //$NON-NLS-1$
toolItemAdd.addListener(SWT.Selection, e -> root.addRuleRow());
}
}