1 11 package org.eclipse.search.internal.ui.util; 12 13 import java.util.Arrays ; 14 import java.util.Comparator ; 15 import java.util.HashSet ; 16 import java.util.Set ; 17 import java.util.StringTokenizer ; 18 19 import org.eclipse.swt.events.DisposeEvent; 20 import org.eclipse.swt.events.DisposeListener; 21 import org.eclipse.swt.events.SelectionAdapter; 22 import org.eclipse.swt.events.SelectionEvent; 23 import org.eclipse.swt.events.SelectionListener; 24 import org.eclipse.swt.widgets.Button; 25 import org.eclipse.swt.widgets.Combo; 26 import org.eclipse.swt.widgets.Widget; 27 28 import org.eclipse.jface.window.Window; 29 30 import org.eclipse.ui.IEditorRegistry; 31 import org.eclipse.ui.dialogs.TypeFilteringDialog; 32 33 import org.eclipse.search.internal.ui.SearchMessages; 34 35 public class FileTypeEditor extends SelectionAdapter implements DisposeListener, SelectionListener { 36 37 private Combo fTextField; 38 private Button fBrowseButton; 39 40 private final static String TYPE_DELIMITER= SearchMessages.FileTypeEditor_typeDelimiter; 41 public final static String FILE_PATTERN_NEGATOR= "!"; 43 private static final Comparator FILE_TYPES_COMPARATOR= new Comparator () { 44 public int compare(Object o1, Object o2) { 45 return compare((String ) o1, (String ) o2); 46 } 47 public int compare(String fp1, String fp2) { 48 boolean isNegative1= fp1.startsWith(FILE_PATTERN_NEGATOR); 49 boolean isNegative2= fp2.startsWith(FILE_PATTERN_NEGATOR); 50 if (isNegative1 != isNegative2) { 51 return isNegative1 ? 1 : -1; 52 } 53 return fp1.compareTo(fp2); 54 } 55 }; 56 57 public FileTypeEditor(IEditorRegistry registry, Combo textField, Button browseButton) { 58 fTextField= textField; 59 fBrowseButton= browseButton; 60 61 fTextField.addDisposeListener(this); 62 fBrowseButton.addDisposeListener(this); 63 fBrowseButton.addSelectionListener(this); 64 } 65 66 public void widgetDisposed(DisposeEvent event) { 67 Widget widget= event.widget; 68 if (widget == fTextField) 69 fTextField= null; 70 else if (widget == fBrowseButton) 71 fBrowseButton= null; 72 } 73 74 public void widgetSelected(SelectionEvent event) { 75 if (event.widget == fBrowseButton) 76 handleBrowseButton(); 77 } 78 79 public void widgetDoubleSelected(SelectionEvent event) { 80 } 81 82 public String [] getFileTypes() { 83 Set result= new HashSet (); 84 StringTokenizer tokenizer= new StringTokenizer (fTextField.getText(), TYPE_DELIMITER); 85 86 while (tokenizer.hasMoreTokens()) { 87 String currentExtension= tokenizer.nextToken().trim(); 88 result.add(currentExtension); 89 } 90 return (String []) result.toArray(new String [result.size()]); 91 } 92 93 public void setFileTypes(String [] types) { 94 fTextField.setText(typesToString(types)); 95 } 96 97 protected void handleBrowseButton() { 98 TypeFilteringDialog dialog= new TypeFilteringDialog(fTextField.getShell(), Arrays.asList(getFileTypes())); 99 if (dialog.open() == Window.OK) { 100 Object [] result= dialog.getResult(); 101 HashSet patterns= new HashSet (); 102 boolean starIncluded= false; 103 for (int i= 0; i < result.length; i++) { 104 String curr= result[i].toString(); 105 if (curr.equals("*")) { starIncluded= true; 107 } else { 108 patterns.add("*." + curr); } 110 } 111 if (patterns.isEmpty() && starIncluded) { patterns.add("*"); } 114 String [] filePatterns= (String []) patterns.toArray(new String [patterns.size()]); 115 Arrays.sort(filePatterns); 116 setFileTypes(filePatterns); 117 } 118 } 119 120 public static String typesToString(String [] types) { 121 Arrays.sort(types, FILE_TYPES_COMPARATOR); 122 StringBuffer result= new StringBuffer (); 123 for (int i= 0; i < types.length; i++) { 124 if (i > 0) { 125 result.append(TYPE_DELIMITER); 126 result.append(" "); } 128 result.append(types[i]); 129 } 130 return result.toString(); 131 } 132 } 133 | Popular Tags |