package eu.jucy.adlsearch.ui; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import logger.LoggerFactory; import helpers.GH; import helpers.SizeEnum; import org.apache.log4j.Logger; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.window.IShellProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; 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.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import eu.jucy.adlsearch.ADLSearchEntry; import eu.jucy.adlsearch.Lang; import eu.jucy.adlsearch.ADLSearchEntry.ADLSearchType; public class ADLSearchDialog extends Dialog { private static final Logger logger = LoggerFactory.make(); private Button downloadmatchesButton; private Button activeButton; private Text maxSizeText; private Text minSizeText; private Combo sizeTypeCombo; private Combo searchTypeCombo; private Text targetFolderText; private Text searchStringText; private Button regexpButton; private Button caseSensitiveRegexpButton; private Text regExpTesterText; private final ADLSearchEntry adlEntry; public ADLSearchDialog(IShellProvider parentShell,ADLSearchEntry adlEntry) { super(parentShell); this.adlEntry = adlEntry; } public ADLSearchDialog(Shell parentShell,ADLSearchEntry adlEntry) { super(parentShell); this.adlEntry = adlEntry; } @Override protected Control createDialogArea(Composite parent) { getShell().setText(Lang.ADL_ADLEntry); // create composite Composite composite = (Composite) super.createDialogArea(parent); final GridLayout gridLayout = new GridLayout(); gridLayout.numColumns = 2; composite.setLayout(gridLayout); final Composite composite_1 = new Composite(composite, SWT.NONE); composite_1.setLayout(new GridLayout()); final Label searchstringLabel = new Label(composite_1, SWT.NONE); searchstringLabel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); searchstringLabel.setText(Lang.ADL_SearchString); searchStringText = new Text(composite_1, SWT.BORDER); searchStringText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); searchStringText.setText(adlEntry.getSearchString()); final Composite composite_3 = new Composite(composite_1, SWT.NONE); composite_3.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); final GridLayout gridLayout_1 = new GridLayout(); gridLayout_1.numColumns = 2; composite_3.setLayout(gridLayout_1); final Label minSizeLabel = new Label(composite_3, SWT.NONE); minSizeLabel.setText(Lang.ADL_MinSize); final Label maxSizeLabel = new Label(composite_3, SWT.NONE); maxSizeLabel.setText(Lang.ADL_MaxSize); minSizeText = new Text(composite_3, SWT.BORDER); minSizeText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); maxSizeText = new Text(composite_3, SWT.BORDER); maxSizeText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); final Label targetFolderLabel = new Label(composite_1, SWT.NONE); targetFolderLabel.setText(Lang.ADL_TargetFolder); targetFolderText = new Text(composite_1, SWT.BORDER); targetFolderText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); targetFolderText.setText(adlEntry.getTargetFolder()); final Composite composite_2 = new Composite(composite, SWT.NONE); composite_2.setLayout(new GridLayout()); composite_2.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false)); final Label searchTypeLabel = new Label(composite_2, SWT.NONE); searchTypeLabel.setText(Lang.ADL_SearchType); searchTypeCombo = new Combo(composite_2, SWT.READ_ONLY); searchTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); for (ADLSearchType st:ADLSearchType.values()) { searchTypeCombo.add(st.toString()); searchTypeCombo.setData(st.toString(),st); } searchTypeCombo.setText( adlEntry.getSearchType().toString() ); final Label sizeTypeLabel = new Label(composite_2, SWT.NONE); sizeTypeLabel.setText(Lang.ADL_SizeType); sizeTypeCombo = new Combo(composite_2, SWT.READ_ONLY); sizeTypeCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); for (SizeEnum se:SizeEnum.values()) { sizeTypeCombo.add(se.name()); sizeTypeCombo.setData(se.name(), se); } activeButton = new Button(composite_2, SWT.CHECK); activeButton.setText(Lang.ADL_Active ); activeButton.setSelection(adlEntry.isActive()); downloadmatchesButton = new Button(composite_2, SWT.CHECK); downloadmatchesButton.setText(Lang.ADL_DownloadMatches); downloadmatchesButton.setSelection(adlEntry.isDownloadMatches()); regexpButton = new Button(composite_2, SWT.CHECK); regexpButton.setText(Lang.ADL_REGEXP); regexpButton.setToolTipText(Lang.ADL_REGEXPTT); regexpButton.setSelection(adlEntry.isRegExp()); regexpButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { caseSensitiveRegexpButton.setEnabled(regexpButton.getSelection()); } }); caseSensitiveRegexpButton = new Button(composite_2, SWT.CHECK); caseSensitiveRegexpButton.setText(Lang.ADL_CASESENSITIVE); caseSensitiveRegexpButton.setSelection(adlEntry.isCaseSensitive()); caseSensitiveRegexpButton.setEnabled(regexpButton.getSelection()); final Group regexpTesterGroup = new Group(composite, SWT.NONE); regexpTesterGroup.setText(Lang.ADL_REGEXPTESTER); final GridLayout gridLayout_3 = new GridLayout(); gridLayout_3.numColumns = 2; regexpTesterGroup.setLayout(gridLayout_3); regexpTesterGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false, 2, 1)); regExpTesterText = new Text(regexpTesterGroup, SWT.BORDER); regExpTesterText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false)); regExpTesterText.setText(""); final Button matchButton = new Button(regexpTesterGroup, SWT.NONE); matchButton.setText(Lang.ADL_REGEXPMATCH); matchButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(final SelectionEvent e) { boolean caseSensitive = caseSensitiveRegexpButton.getSelection(); Pattern p = Pattern.compile(searchStringText.getText(), Pattern.DOTALL |(caseSensitive? 0:Pattern.UNICODE_CASE|Pattern.CASE_INSENSITIVE)); boolean matches = p.matcher(regExpTesterText.getText()).matches(); MessageDialog.openInformation(getParentShell(),Lang.ADL_REGEXPTESTER, matches? Lang.ADL_REGEXPMATCH_SUCC : Lang.ADL_REGEXPMATCH_FAIL ); } }); setSizes(); return composite; } @Override protected void okPressed() { boolean allok = true; try { adlEntry.setSearchString(searchStringText.getText()); adlEntry.setActive(activeButton.getSelection()); adlEntry.setDownloadMatches(downloadmatchesButton.getSelection()); Object o = searchTypeCombo.getData(searchTypeCombo.getText()); adlEntry.setSearchType((ADLSearchType)o); adlEntry.setMinSize( parseSize(minSizeText.getText())); adlEntry.setMaxSize( parseSize(maxSizeText.getText())); adlEntry.setTargetFolder(targetFolderText.getText()); adlEntry.setCaseSensitive(caseSensitiveRegexpButton.getEnabled()); adlEntry.setRegExp(regexpButton.getSelection()); if (adlEntry.isRegExp()) { // test validity.. Pattern.compile(adlEntry.getSearchString()); } } catch(PatternSyntaxException pse) { MessageDialog.openWarning(getShell(), "Error", pse.toString()); allok = false; } catch(RuntimeException re) { logger.error(re,re); allok = false; } if (allok) { super.okPressed(); } } private long parseSize(String s) { if (GH.isEmpty(s)) { return -1; } try { long size = Long.parseLong(s); if (size >= 0) { SizeEnum se = getSelectedSize(); return se.getInBytes(size); } } catch(NumberFormatException nfe) { return -1; } return -1; } private SizeEnum getSelectedSize() { String s = sizeTypeCombo.getText(); SizeEnum se = (SizeEnum)sizeTypeCombo.getData(s); if (se == null) { se = SizeEnum.B; } return se; } private void setSizes() { long larger = Math.max(adlEntry.getMinSize(), adlEntry.getMaxSize()); SizeEnum active = SizeEnum.getLargestEnumMatchingByteSize(larger); sizeTypeCombo.setText(active.name()); minSizeText.setText(parse(adlEntry.getMinSize() ,active)); maxSizeText.setText(parse(adlEntry.getMaxSize() ,active)); } private String parse(long byteSize,SizeEnum used) { if (byteSize < 0) { return ""; } return Long.toString(used.getSize(byteSize)); } public ADLSearchEntry getAdlEntry() { return adlEntry; } }