/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * */ package org.apache.directory.studio.schemaeditor.view.views; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; import org.apache.directory.api.ldap.model.schema.AttributeType; import org.apache.directory.api.ldap.model.schema.MutableObjectClass; import org.apache.directory.api.ldap.model.schema.ObjectClass; import org.apache.directory.api.ldap.model.schema.SchemaObject; import org.apache.directory.studio.schemaeditor.Activator; import org.apache.directory.studio.schemaeditor.PluginConstants; import org.apache.directory.studio.schemaeditor.PluginUtils; import org.apache.directory.studio.schemaeditor.controller.SchemaHandler; import org.apache.directory.studio.schemaeditor.controller.SearchViewController; import org.apache.directory.studio.schemaeditor.view.ViewUtils; import org.apache.directory.studio.schemaeditor.view.editors.attributetype.AttributeTypeEditor; import org.apache.directory.studio.schemaeditor.view.editors.attributetype.AttributeTypeEditorInput; import org.apache.directory.studio.schemaeditor.view.editors.objectclass.ObjectClassEditor; import org.apache.directory.studio.schemaeditor.view.editors.objectclass.ObjectClassEditorInput; import org.apache.directory.studio.schemaeditor.view.search.SearchPage; import org.apache.directory.studio.schemaeditor.view.search.SearchPage.SearchInEnum; import org.eclipse.jface.action.Action; import org.eclipse.jface.dialogs.IDialogSettings; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.part.ViewPart; /** * This class represents the Search View. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class SearchView extends ViewPart { /** The view's ID */ public static final String ID = PluginConstants.VIEW_SEARCH_VIEW_ID; /** The current Search String */ private String searchString; // UI fields private Text searchField; private Button searchButton; private Label searchResultsLabel; private Table resultsTable; private TableViewer resultsTableViewer; private Composite searchFieldComposite; private Composite searchFieldInnerComposite; private Label separatorLabel; /** The parent composite */ private Composite parent; /** * {@inheritDoc} */ public void createPartControl( Composite parent ) { // Help Context for Dynamic Help PlatformUI.getWorkbench().getHelpSystem().setHelp( parent, PluginConstants.PLUGIN_ID + "." + "search_view" ); //$NON-NLS-1$ //$NON-NLS-2$ this.parent = parent; GridLayout gridLayout = new GridLayout(); gridLayout.horizontalSpacing = 0; gridLayout.marginBottom = 0; gridLayout.marginHeight = 0; gridLayout.marginLeft = 0; gridLayout.marginRight = 0; gridLayout.marginTop = 0; gridLayout.marginWidth = 0; gridLayout.verticalSpacing = 0; parent.setLayout( gridLayout ); // Search Field searchFieldComposite = new Composite( parent, SWT.NONE ); gridLayout = new GridLayout(); gridLayout.horizontalSpacing = 0; gridLayout.marginBottom = 0; gridLayout.marginHeight = 0; gridLayout.marginLeft = 0; gridLayout.marginRight = 0; gridLayout.marginTop = 0; gridLayout.marginWidth = 0; gridLayout.verticalSpacing = 0; searchFieldComposite.setLayout( gridLayout ); searchFieldComposite.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); // This searchFieldCompositeSeparator is used to display correctly the searchFieldComposite, // since an empty composite does not display well. Label searchFieldCompositeSeparator = new Label( searchFieldComposite, SWT.SEPARATOR | SWT.HORIZONTAL ); GridData gridData = new GridData( SWT.FILL, SWT.NONE, true, false ); gridData.heightHint = 1; searchFieldCompositeSeparator.setLayoutData( gridData ); searchFieldCompositeSeparator.setVisible( false ); // Search Results Label searchResultsLabel = new Label( parent, SWT.NONE ); searchResultsLabel.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); // Separator Label Label separatorLabel2 = new Label( parent, SWT.SEPARATOR | SWT.HORIZONTAL ); separatorLabel2.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); // Create the table createTableViewer(); setSearchResultsLabel( null, 0 ); new SearchViewController( this ); } /** * Create the Search Field Sections. */ private void createSearchField() { // Search Inner Composite searchFieldInnerComposite = new Composite( searchFieldComposite, SWT.NONE ); GridLayout searchFieldInnerCompositeGridLayout = new GridLayout( 4, false ); searchFieldInnerCompositeGridLayout.horizontalSpacing = 1; searchFieldInnerCompositeGridLayout.verticalSpacing = 1; searchFieldInnerCompositeGridLayout.marginHeight = 1; searchFieldInnerCompositeGridLayout.marginWidth = 2; searchFieldInnerComposite.setLayout( searchFieldInnerCompositeGridLayout ); searchFieldInnerComposite.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); // Search Label Label searchFieldLabel = new Label( searchFieldInnerComposite, SWT.NONE ); searchFieldLabel.setText( Messages.getString( "SearchView.SearchColon" ) ); //$NON-NLS-1$ searchFieldLabel.setLayoutData( new GridData( SWT.NONE, SWT.CENTER, false, false ) ); // Search Text Field searchField = new Text( searchFieldInnerComposite, SWT.BORDER | SWT.SEARCH | SWT.CANCEL ); if ( searchString != null ) { searchField.setText( searchString ); } searchField.setLayoutData( new GridData( SWT.FILL, SWT.CENTER, true, false ) ); searchField.addModifyListener( new ModifyListener() { public void modifyText( ModifyEvent e ) { validateSearchField(); } } ); searchField.addKeyListener( new KeyAdapter() { public void keyReleased( KeyEvent e ) { if ( e.keyCode == SWT.ARROW_DOWN ) { resultsTable.setFocus(); } else if ( ( e.keyCode == Action.findKeyCode( "RETURN" ) ) || ( e.keyCode == SWT.KEYPAD_CR ) ) //$NON-NLS-1$ { search(); } } } ); // Search Toolbar final ToolBar searchToolBar = new ToolBar( searchFieldInnerComposite, SWT.HORIZONTAL | SWT.FLAT ); // Creating the Search In ToolItem final ToolItem searchInToolItem = new ToolItem( searchToolBar, SWT.DROP_DOWN ); searchInToolItem.setText( Messages.getString( "SearchView.SearchIn" ) ); //$NON-NLS-1$ // Adding the action to display the Menu when the item is clicked searchInToolItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent event ) { Rectangle rect = searchInToolItem.getBounds(); Point pt = new Point( rect.x, rect.y + rect.height ); pt = searchToolBar.toDisplay( pt ); Menu menu = createSearchInMenu(); menu.setLocation( pt.x, pt.y ); menu.setVisible( true ); } } ); new ToolItem( searchToolBar, SWT.SEPARATOR ); final ToolItem scopeToolItem = new ToolItem( searchToolBar, SWT.DROP_DOWN ); scopeToolItem.setText( Messages.getString( "SearchView.Scope" ) ); //$NON-NLS-1$ // Adding the action to display the Menu when the item is clicked scopeToolItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent event ) { Rectangle rect = scopeToolItem.getBounds(); Point pt = new Point( rect.x, rect.y + rect.height ); pt = searchToolBar.toDisplay( pt ); Menu menu = createScopeMenu(); menu.setLocation( pt.x, pt.y ); menu.setVisible( true ); } } ); searchToolBar.setLayoutData( new GridData( SWT.NONE, SWT.CENTER, false, false ) ); // Search Button searchButton = new Button( searchFieldInnerComposite, SWT.PUSH | SWT.DOWN ); searchButton.setEnabled( false ); searchButton.setImage( Activator.getDefault().getImage( PluginConstants.IMG_SEARCH ) ); searchButton.setToolTipText( Messages.getString( "SearchView.Search" ) ); //$NON-NLS-1$ searchButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { search(); } } ); searchButton.setLayoutData( new GridData( SWT.NONE, SWT.CENTER, false, false ) ); // Separator Label separatorLabel = new Label( searchFieldComposite, SWT.SEPARATOR | SWT.HORIZONTAL ); separatorLabel.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); } /** * Creates the Search In Menu * * @return * the Search In menu */ public Menu createSearchInMenu() { final IDialogSettings settings = Activator.getDefault().getDialogSettings(); // Creating the associated Menu Menu searchInMenu = new Menu( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.POP_UP ); // Filling the menu // Aliases final MenuItem aliasesMenuItem = new MenuItem( searchInMenu, SWT.CHECK ); aliasesMenuItem.setText( Messages.getString( "SearchView.Aliases" ) ); //$NON-NLS-1$ aliasesMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_ALIASES, aliasesMenuItem.getSelection() ); } } ); // OID final MenuItem oidMenuItem = new MenuItem( searchInMenu, SWT.CHECK ); oidMenuItem.setText( Messages.getString( "SearchView.OID" ) ); //$NON-NLS-1$ oidMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_OID, oidMenuItem.getSelection() ); } } ); // Description final MenuItem descriptionMenuItem = new MenuItem( searchInMenu, SWT.CHECK ); descriptionMenuItem.setText( Messages.getString( "SearchView.Description" ) ); //$NON-NLS-1$ descriptionMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_DESCRIPTION, descriptionMenuItem .getSelection() ); } } ); // Separator new MenuItem( searchInMenu, SWT.SEPARATOR ); // Superior final MenuItem superiorMenuItem = new MenuItem( searchInMenu, SWT.CHECK ); superiorMenuItem.setText( Messages.getString( "SearchView.Superior" ) ); //$NON-NLS-1$ superiorMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_SUPERIOR, superiorMenuItem.getSelection() ); } } ); // Syntax final MenuItem syntaxMenuItem = new MenuItem( searchInMenu, SWT.CHECK ); syntaxMenuItem.setText( Messages.getString( "SearchView.Syntax" ) ); //$NON-NLS-1$ syntaxMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_SYNTAX, syntaxMenuItem.getSelection() ); } } ); // Matching Rules final MenuItem matchingRulesMenuItem = new MenuItem( searchInMenu, SWT.CHECK ); matchingRulesMenuItem.setText( Messages.getString( "SearchView.MatchingRules" ) ); //$NON-NLS-1$ matchingRulesMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_MATCHING_RULES, matchingRulesMenuItem .getSelection() ); } } ); // Separator new MenuItem( searchInMenu, SWT.SEPARATOR ); // Superiors final MenuItem superiorsMenuItem = new MenuItem( searchInMenu, SWT.CHECK ); superiorsMenuItem.setText( Messages.getString( "SearchView.Superiors" ) ); //$NON-NLS-1$ superiorsMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_SUPERIORS, superiorsMenuItem.getSelection() ); } } ); // Mandatory Attributes final MenuItem mandatoryAttributesMenuItem = new MenuItem( searchInMenu, SWT.CHECK ); mandatoryAttributesMenuItem.setText( Messages.getString( "SearchView.MandatoryAttributes" ) ); //$NON-NLS-1$ mandatoryAttributesMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_MANDATORY_ATTRIBUTES, mandatoryAttributesMenuItem.getSelection() ); } } ); // Optional Attributes final MenuItem optionalAttributesMenuItem = new MenuItem( searchInMenu, SWT.CHECK ); optionalAttributesMenuItem.setText( Messages.getString( "SearchView.OptionalAttributes" ) ); //$NON-NLS-1$ optionalAttributesMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_OPTIONAL_ATTRIBUTES, optionalAttributesMenuItem.getSelection() ); } } ); if ( settings.get( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_ALIASES ) == null ) { aliasesMenuItem.setSelection( true ); } else { aliasesMenuItem.setSelection( settings.getBoolean( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_ALIASES ) ); } if ( settings.get( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_OID ) == null ) { oidMenuItem.setSelection( true ); } else { oidMenuItem.setSelection( settings.getBoolean( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_OID ) ); } if ( settings.get( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_DESCRIPTION ) == null ) { descriptionMenuItem.setSelection( true ); } else { descriptionMenuItem.setSelection( settings .getBoolean( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_DESCRIPTION ) ); } superiorMenuItem.setSelection( settings.getBoolean( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_SUPERIOR ) ); syntaxMenuItem.setSelection( settings.getBoolean( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_SYNTAX ) ); matchingRulesMenuItem.setSelection( settings .getBoolean( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_MATCHING_RULES ) ); superiorsMenuItem.setSelection( settings.getBoolean( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_SUPERIORS ) ); mandatoryAttributesMenuItem.setSelection( settings .getBoolean( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_MANDATORY_ATTRIBUTES ) ); optionalAttributesMenuItem.setSelection( settings .getBoolean( PluginConstants.PREFS_SEARCH_PAGE_SEARCH_IN_OPTIONAL_ATTRIBUTES ) ); return searchInMenu; } /** * Creates the Scope Menu * * @return * the Scope menu */ public Menu createScopeMenu() { final IDialogSettings settings = Activator.getDefault().getDialogSettings(); // Creating the associated Menu Menu scopeMenu = new Menu( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.POP_UP ); // Filling the menu // Attribute Types And Object Classes final MenuItem attributeTypesAndObjectClassesMenuItem = new MenuItem( scopeMenu, SWT.RADIO ); attributeTypesAndObjectClassesMenuItem.setText( Messages.getString( "SearchView.TypesAndClasses" ) ); //$NON-NLS-1$ attributeTypesAndObjectClassesMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SCOPE, PluginConstants.PREFS_SEARCH_PAGE_SCOPE_AT_AND_OC ); } } ); // Attributes Type Only final MenuItem attributesTypesOnlyMenuItem = new MenuItem( scopeMenu, SWT.RADIO ); attributesTypesOnlyMenuItem.setText( Messages.getString( "SearchView.TypesOnly" ) ); //$NON-NLS-1$ attributesTypesOnlyMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SCOPE, PluginConstants.PREFS_SEARCH_PAGE_SCOPE_AT_ONLY ); } } ); // Object Classes Only final MenuItem objectClassesMenuItem = new MenuItem( scopeMenu, SWT.RADIO ); objectClassesMenuItem.setText( Messages.getString( "SearchView.ClassesOnly" ) ); //$NON-NLS-1$ objectClassesMenuItem.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { settings.put( PluginConstants.PREFS_SEARCH_PAGE_SCOPE, PluginConstants.PREFS_SEARCH_PAGE_SCOPE_OC_ONLY ); } } ); if ( settings.get( PluginConstants.PREFS_SEARCH_PAGE_SCOPE ) == null ) { attributeTypesAndObjectClassesMenuItem.setSelection( true ); } else { switch ( settings.getInt( PluginConstants.PREFS_SEARCH_PAGE_SCOPE ) ) { case PluginConstants.PREFS_SEARCH_PAGE_SCOPE_AT_AND_OC: attributeTypesAndObjectClassesMenuItem.setSelection( true ); break; case PluginConstants.PREFS_SEARCH_PAGE_SCOPE_AT_ONLY: attributesTypesOnlyMenuItem.setSelection( true ); break; case PluginConstants.PREFS_SEARCH_PAGE_SCOPE_OC_ONLY: objectClassesMenuItem.setSelection( true ); break; } } return scopeMenu; } /** * Creates the TableViewer. */ private void createTableViewer() { // Creating the TableViewer resultsTable = new Table( parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION ); GridData gridData = new GridData( SWT.FILL, SWT.FILL, true, true ); resultsTable.setLayoutData( gridData ); resultsTable.setLinesVisible( true ); // Creating the TableViewer resultsTableViewer = new TableViewer( resultsTable ); resultsTableViewer.setLabelProvider( new DecoratingLabelProvider( new SearchViewLabelProvider(), Activator .getDefault().getWorkbench().getDecoratorManager().getLabelDecorator() ) ); resultsTableViewer.setContentProvider( new SearchViewContentProvider() ); // Adding listeners resultsTable.addKeyListener( new KeyAdapter() { public void keyPressed( KeyEvent e ) { if ( ( e.keyCode == Action.findKeyCode( "RETURN" ) ) || ( e.keyCode == SWT.KEYPAD_CR ) ) // return key //$NON-NLS-1$ { openEditor(); } } } ); resultsTableViewer.addDoubleClickListener( new IDoubleClickListener() { public void doubleClick( DoubleClickEvent event ) { openEditor(); } } ); } /** * Open the editor associated with the current selection in the table. */ private void openEditor() { if ( Activator.getDefault().getSchemaHandler() != null ) { StructuredSelection selection = ( StructuredSelection ) resultsTableViewer.getSelection(); if ( !selection.isEmpty() ) { Object item = selection.getFirstElement(); IEditorInput input = null; String editorId = null; // Here is the double clicked item if ( item instanceof AttributeType ) { input = new AttributeTypeEditorInput( ( AttributeType ) item ); editorId = AttributeTypeEditor.ID; } else if ( item instanceof ObjectClass ) { input = new ObjectClassEditorInput( ( MutableObjectClass ) item ); editorId = ObjectClassEditor.ID; } // Let's open the editor if ( input != null ) { try { PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().openEditor( input, editorId ); } catch ( PartInitException exception ) { PluginUtils.logError( Messages.getString( "SearchView.ErrorOpeningEditor" ), exception ); //$NON-NLS-1$ ViewUtils .displayErrorMessageDialog( Messages.getString( "SearchView.Error" ), Messages.getString( "SearchView.ErrorOpeningEditor" ) ); //$NON-NLS-1$ //$NON-NLS-2$ } } } } } /** * {@inheritDoc} */ public void setFocus() { if ( searchField != null && !searchField.isDisposed() ) { searchField.setFocus(); } else { resultsTable.setFocus(); } } /** * Shows the Search Field Section. */ public void showSearchFieldSection() { createSearchField(); parent.layout( true, true ); searchField.setFocus(); validateSearchField(); } /** * Hides the Search Field Section. */ public void hideSearchFieldSection() { if ( searchFieldInnerComposite != null ) { searchFieldInnerComposite.dispose(); searchFieldInnerComposite = null; } if ( separatorLabel != null ) { separatorLabel.dispose(); separatorLabel = null; } parent.layout( true, true ); resultsTable.setFocus(); } private void validateSearchField() { searchButton.setEnabled( searchField.getText().length() > 0 ); } /** * Sets the Search Input. * * @param searchString * the search String * @param searchIn * the search In * @param scope * the scope */ public void setSearchInput( String searchString, SearchInEnum[] searchIn, int scope ) { this.searchString = searchString; // Saving search String and Search Scope to dialog settings SearchPage.addSearchStringHistory( searchString ); SearchPage.saveSearchScope( Arrays.asList( searchIn ) ); if ( ( searchField != null ) && ( !searchField.isDisposed() ) ) { searchField.setText( searchString ); validateSearchField(); } List<SchemaObject> results = search( searchString, searchIn, scope ); setSearchResultsLabel( searchString, results.size() ); resultsTableViewer.setInput( results ); } /** * Searches the objects corresponding to the search parameters. * * @param searchString * the search String * @param searchIn * the search In * @param scope * the scope */ private List<SchemaObject> search( String searchString, SearchInEnum[] searchIn, int scope ) { List<SchemaObject> searchResults = new ArrayList<SchemaObject>(); if ( searchString != null ) { String computedSearchString = searchString.replaceAll( "\\*", "[\\\\S]*" ); //$NON-NLS-1$ //$NON-NLS-2$ computedSearchString = computedSearchString.replaceAll( "\\?", "[\\\\S]" ); //$NON-NLS-1$ //$NON-NLS-2$ Pattern pattern = Pattern.compile( computedSearchString, Pattern.CASE_INSENSITIVE ); SchemaHandler schemaHandler = Activator.getDefault().getSchemaHandler(); if ( schemaHandler != null ) { List<SearchInEnum> searchScope = new ArrayList<SearchInEnum>( Arrays.asList( searchIn ) ); if ( ( scope == PluginConstants.PREFS_SEARCH_PAGE_SCOPE_AT_AND_OC ) || ( scope == PluginConstants.PREFS_SEARCH_PAGE_SCOPE_AT_ONLY ) ) { // Looping on attribute types List<AttributeType> attributeTypes = schemaHandler.getAttributeTypes(); for ( AttributeType at : attributeTypes ) { // Aliases if ( searchScope.contains( SearchInEnum.ALIASES ) ) { if ( checkList( pattern, at.getNames() ) ) { searchResults.add( at ); continue; } } // OID if ( searchScope.contains( SearchInEnum.OID ) ) { if ( checkString( pattern, at.getOid() ) ) { searchResults.add( at ); continue; } } // Description if ( searchScope.contains( SearchInEnum.DESCRIPTION ) ) { if ( checkString( pattern, at.getDescription() ) ) { searchResults.add( at ); continue; } } // Superior if ( searchScope.contains( SearchInEnum.SUPERIOR ) ) { if ( checkString( pattern, at.getSuperiorOid() ) ) { searchResults.add( at ); continue; } } // Syntax if ( searchScope.contains( SearchInEnum.SYNTAX ) ) { if ( checkString( pattern, at.getSyntaxOid() ) ) { searchResults.add( at ); continue; } } // Matching Rules if ( searchScope.contains( SearchInEnum.MATCHING_RULES ) ) { // Equality if ( checkString( pattern, at.getEqualityOid() ) ) { searchResults.add( at ); continue; } // Ordering if ( checkString( pattern, at.getOrderingOid() ) ) { searchResults.add( at ); continue; } // Substring if ( checkString( pattern, at.getSubstringOid() ) ) { searchResults.add( at ); continue; } } } } if ( ( scope == PluginConstants.PREFS_SEARCH_PAGE_SCOPE_AT_AND_OC ) || ( scope == PluginConstants.PREFS_SEARCH_PAGE_SCOPE_OC_ONLY ) ) { // Looping on object classes List<ObjectClass> objectClasses = schemaHandler.getObjectClasses(); for ( ObjectClass oc : objectClasses ) { // Aliases if ( searchScope.contains( SearchInEnum.ALIASES ) ) { if ( checkList( pattern, oc.getNames() ) ) { searchResults.add( oc ); continue; } } // OID if ( searchScope.contains( SearchInEnum.OID ) ) { if ( checkString( pattern, oc.getOid() ) ) { searchResults.add( oc ); continue; } } // Description if ( searchScope.contains( SearchInEnum.DESCRIPTION ) ) { if ( checkString( pattern, oc.getDescription() ) ) { searchResults.add( oc ); continue; } } // Superiors if ( searchScope.contains( SearchInEnum.SUPERIORS ) ) { if ( checkList( pattern, oc.getSuperiorOids() ) ) { searchResults.add( oc ); continue; } } // Mandatory Attributes if ( searchScope.contains( SearchInEnum.MANDATORY_ATTRIBUTES ) ) { if ( checkList( pattern, oc.getMustAttributeTypeOids() ) ) { searchResults.add( oc ); continue; } } // Optional Attributes if ( searchScope.contains( SearchInEnum.OPTIONAL_ATTRIBUTES ) ) { if ( checkList( pattern, oc.getMayAttributeTypeOids() ) ) { searchResults.add( oc ); continue; } } } } } } return searchResults; } /** * Check an array with the given pattern. * * @param pattern * the Regex pattern * @param list * the array * @return * true if the pattern matches one of the aliases, false, if not. */ private boolean checkList( Pattern pattern, List<String> list ) { if ( list != null ) { for ( String string : list ) { if ( pattern.matcher( string ).matches() ) { return true; } } } return false; } private boolean checkString( Pattern pattern, String string ) { if ( string != null ) { return pattern.matcher( string ).matches(); } return false; } /** * Launches the search from the search fields views. */ private void search() { String searchString = searchField.getText(); List<SearchInEnum> searchScope = SearchPage.loadSearchIn(); setSearchInput( searchString, searchScope.toArray( new SearchInEnum[0] ), SearchPage.loadScope() ); } /** * Refresh the overview label with the number of results. * * @param searchString * the search String * @param resultsCount * the number of results */ public void setSearchResultsLabel( String searchString, int resultsCount ) { StringBuffer sb = new StringBuffer(); if ( searchString == null ) { sb.append( Messages.getString( "SearchView.NoSearch" ) ); //$NON-NLS-1$ } else { // Search String sb.append( "'" + searchString + "'" ); //$NON-NLS-1$ //$NON-NLS-2$ sb.append( " - " ); //$NON-NLS-1$ // Search results count sb.append( resultsCount ); sb.append( " " ); //$NON-NLS-1$ if ( resultsCount > 1 ) { sb.append( Messages.getString( "SearchView.Matches" ) ); //$NON-NLS-1$ } else { sb.append( Messages.getString( "SearchView.Match" ) ); //$NON-NLS-1$ } sb.append( Messages.getString( "SearchView.InWorkspace" ) ); //$NON-NLS-1$ } searchResultsLabel.setText( sb.toString() ); } /** * Runs the current search again. */ public void runCurrentSearchAgain() { if ( searchString != null ) { setSearchInput( searchString, SearchPage.loadSearchIn().toArray( new SearchInEnum[0] ), SearchPage .loadScope() ); } } /** * Gets the Search String. * * @return * the Search String or null if no Search String is set. */ public String getSearchString() { return searchString; } /** * Refreshes the view. */ public void refresh() { resultsTableViewer.refresh(); } }