/* * 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; import java.util.ArrayList; 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.values.OperandValue; import net.sourceforge.fullsync.ui.filterrule.FilterRuleListItem; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; public class FileFilterPage extends WizardDialog { private Combo comboFilterType; private Label label1; private Combo comboMatchType; private Label label2; private ScrolledComposite scrolledComposite1; private Composite compositeRuleList; private Button buttonAppliesToDir; private FileFilterManager fileFilterManager = new FileFilterManager(); private FileFilter fileFilter; private ArrayList<FilterRuleListItem> ruleItems = new ArrayList<FilterRuleListItem>(); public FileFilterPage(Shell parent, FileFilter filter) { super(parent); fileFilter = filter; } @Override public String getTitle() { return "File Filter"; } @Override public String getCaption() { return "Edit the file filter"; } @Override public String getDescription() { return ""; } @Override public Image getIcon() { return GuiController.getInstance().getImage("FileFilter_Default.png"); //$NON-NLS-1$ } @Override public Image getImage() { return GuiController.getInstance().getImage("FileFilter_Wizard.png"); //$NON-NLS-1$ } @Override public void createContent(Composite content) { try { content.setLayout(new GridLayout(4, false)); content.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); content.setSize(700, 500); // filter type combo comboFilterType = new Combo(content, SWT.DROP_DOWN | SWT.READ_ONLY); comboFilterType.add("Include"); comboFilterType.add("Exclude"); label1 = new Label(content, SWT.NONE); label1.setText(" any file that matches "); // match type combo comboMatchType = new Combo(content, SWT.DROP_DOWN | SWT.READ_ONLY); comboMatchType.add("all"); comboMatchType.add("any"); label2 = new Label(content, SWT.NONE); label2.setText("of the following"); // applies to directories buttonAppliesToDir = new Button(content, SWT.CHECK | SWT.LEFT); buttonAppliesToDir.setText("Applies to directories"); GridData buttonAppliesToDirLData = new GridData(); buttonAppliesToDirLData.horizontalSpan = 4; buttonAppliesToDir.setLayoutData(buttonAppliesToDirLData); // filter list GridData scrolledComposite1LData = new GridData(SWT.FILL, SWT.FILL, true, true); scrolledComposite1LData.horizontalSpan = 4; scrolledComposite1 = new ScrolledComposite(content, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER); createCompositeRuleList(); scrolledComposite1.setLayoutData(scrolledComposite1LData); scrolledComposite1.setAlwaysShowScrollBars(false); if (fileFilter != null) { comboMatchType.select(fileFilter.getMatchType()); comboFilterType.select(fileFilter.getFilterType()); buttonAppliesToDir.setSelection(fileFilter.appliesToDirectories()); FileFilterRule[] rules = fileFilter.getFileFiltersRules(); if (rules.length > 0) { for (FileFilterRule rule : rules) { addRuleRow(rule.getRuleType(), rule.getOperator(), rule.getValue()); } } else { addRuleRow(); } } else { comboMatchType.select(0); comboFilterType.select(0); buttonAppliesToDir.setSelection(true); addRuleRow(); } content.layout(); } catch (Exception e) { e.printStackTrace(); } } @Override public boolean apply() { fileFilter = new FileFilter(); fileFilter.setMatchType(comboMatchType.getSelectionIndex()); fileFilter.setFilterType(comboFilterType.getSelectionIndex()); fileFilter.setAppliesToDirectories(buttonAppliesToDir.getSelection()); FileFilterRule[] rules = new FileFilterRule[ruleItems.size()]; for (int i = 0; i < rules.length; i++) { FilterRuleListItem ruleItem = ruleItems.get(i); rules[i] = fileFilterManager.createFileFilterRule(ruleItem.getRuleType(), ruleItem.getOperator(), ruleItem.getValue()); } fileFilter.setFileFilterRules(rules); return true; //FIXME: return false if failed } @Override public boolean cancel() { fileFilter = null; return true; } public void addRuleRow() { addRuleRow(null, -1, null); } protected void addRuleRow(String ruleType, int op, OperandValue value) { FilterRuleListItem ruleItem = new FilterRuleListItem(this, compositeRuleList, fileFilterManager, ruleType, op, value); ruleItems.add(ruleItem); compositeRuleList.pack(); } public void recreateRuleList() { compositeRuleList.dispose(); createCompositeRuleList(); for (FilterRuleListItem item : ruleItems) { item.init(compositeRuleList); } compositeRuleList.pack(); } public void deleteRule(FilterRuleListItem item) { if (ruleItems.size() > 1) { ruleItems.remove(item); recreateRuleList(); } } protected void createCompositeRuleList() { compositeRuleList = new Composite(scrolledComposite1, SWT.FILL); GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true); compositeRuleList.setLayoutData(layoutData); scrolledComposite1.setContent(compositeRuleList); compositeRuleList.setLayout(new GridLayout(4, false)); } public FileFilter getFileFilter() { return fileFilter; } }