/* * 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.ldapbrowser.ui.editors.searchresult; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator; import org.apache.directory.studio.ldapbrowser.core.events.EntryModificationEvent; import org.apache.directory.studio.ldapbrowser.core.events.EntryUpdateListener; import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry; import org.apache.directory.studio.ldapbrowser.core.model.AttributeHierarchy; import org.apache.directory.studio.ldapbrowser.core.model.IAttribute; import org.apache.directory.studio.ldapbrowser.core.model.IEntry; import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult; import org.apache.directory.studio.ldapbrowser.core.model.impl.Attribute; import org.apache.directory.studio.ldapbrowser.core.model.impl.SearchResult; import org.apache.directory.studio.ldapbrowser.core.utils.CompoundModification; import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.TableCursor; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.widgets.Display; /** * The cursor implementation for the search result editor. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class SearchResultEditorCursor extends TableCursor implements ISelectionProvider, EntryUpdateListener { /** The viewer. */ private TableViewer viewer; /** The selection changes listener list. */ private List<ISelectionChangedListener> selectionChangesListenerList; /** The cloned reference copy of the search result under the cursor */ private ISearchResult referenceCopy; /** The cloned working copy of the search result under the cursor */ private ISearchResult workingCopy; /** * Creates a new instance of SearchResultEditorCursor. * * @param viewer the viewer */ public SearchResultEditorCursor( TableViewer viewer ) { super( viewer.getTable(), SWT.NONE ); this.viewer = viewer; this.selectionChangesListenerList = new ArrayList<ISelectionChangedListener>(); setBackground( Display.getDefault().getSystemColor( SWT.COLOR_LIST_SELECTION ) ); setForeground( Display.getDefault().getSystemColor( SWT.COLOR_LIST_SELECTION_TEXT ) ); EventRegistry.addEntryUpdateListener( this, BrowserCommonActivator.getDefault().getEventRunner() ); initSelectionChecker(); initSelectionProvider(); } /** * Initializes the selection checker. */ private void initSelectionChecker() { addSelectionListener( new SelectionListener() { public void widgetSelected( SelectionEvent e ) { checkSelection(); } public void widgetDefaultSelected( SelectionEvent e ) { checkSelection(); } private void checkSelection() { if ( viewer != null && viewer.getColumnProperties() != null && viewer.getColumnProperties().length - 1 < getColumn() ) { setSelection( getRow(), viewer.getColumnProperties().length - 1 ); } } } ); } /** * Initializes the selection provider. */ private void initSelectionProvider() { addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { for ( Iterator<?> it = selectionChangesListenerList.iterator(); it.hasNext(); ) { ( ( ISelectionChangedListener ) it.next() ).selectionChanged( new SelectionChangedEvent( SearchResultEditorCursor.this, getSelection() ) ); } } } ); } /** * {@inheritDoc} */ public boolean setFocus() { return super.setFocus(); } /** * {@inheritDoc} */ public void dispose() { EventRegistry.removeEntryUpdateListener( this ); viewer = null; super.dispose(); } /** * {@inheritDoc} */ public void entryUpdated( EntryModificationEvent event ) { viewer.refresh(); redraw(); } /** * Gets the selected property. * * @return the selected property */ public String getSelectedProperty() { if ( !isDisposed() && getRow() != null && viewer != null && viewer.getColumnProperties() != null && viewer.getColumnProperties().length >= getColumn() + 1 ) { String property = ( String ) viewer.getColumnProperties()[getColumn()]; return property; } return null; } /** * Gets the selected attribute hierarchy. * * @return the selected attribute hierarchy */ public AttributeHierarchy getSelectedAttributeHierarchy() { if ( !isDisposed() && getRow() != null && viewer != null && viewer.getColumnProperties() != null && viewer.getColumnProperties().length >= getColumn() + 1 ) { ISearchResult sr = getSelectedSearchResult(); String property = ( String ) viewer.getColumnProperties()[getColumn()]; if ( sr != null && !BrowserUIConstants.DN.equals( property ) ) { AttributeHierarchy ah = sr.getAttributeWithSubtypes( property ); if ( ah == null ) { ah = new AttributeHierarchy( sr.getEntry(), property, new IAttribute[] { new Attribute( sr.getEntry(), property ) } ); } return ah; } } return null; } /** * Gets the selected search result. * * @return the selected search result */ public ISearchResult getSelectedSearchResult() { if ( !isDisposed() && getRow() != null ) { Object o = getRow().getData(); if ( o instanceof ISearchResult ) { ISearchResult sr = ( ISearchResult ) o; if ( !sr.equals( workingCopy ) ) { IEntry entry = sr.getEntry(); IEntry referenceEntry = new CompoundModification().cloneEntry( entry ); referenceCopy = new SearchResult( referenceEntry, sr.getSearch() ); IEntry workingEntry = new CompoundModification().cloneEntry( entry ); workingCopy = new SearchResult( workingEntry, sr.getSearch() ); } return workingCopy; } } return null; } /** * Gets the selected reference copy. * * @return the selected reference copy, may be null */ public ISearchResult getSelectedReferenceCopy() { return referenceCopy; } /** * Resets reference and working copy copy. */ public void resetCopies() { referenceCopy = null; workingCopy = null; // update all actions with the fresh selection for ( Iterator<?> it = selectionChangesListenerList.iterator(); it.hasNext(); ) { ( ( ISelectionChangedListener ) it.next() ).selectionChanged( new SelectionChangedEvent( SearchResultEditorCursor.this, getSelection() ) ); } } /** * {@inheritDoc} */ public void addSelectionChangedListener( ISelectionChangedListener listener ) { if ( !selectionChangesListenerList.contains( listener ) ) { selectionChangesListenerList.add( listener ); } } /** * {@inheritDoc} */ public ISelection getSelection() { ISearchResult searchResult = getSelectedSearchResult(); AttributeHierarchy ah = getSelectedAttributeHierarchy(); String property = getSelectedProperty(); List<Object> list = new ArrayList<Object>(); if ( searchResult != null ) { list.add( searchResult ); } if ( ah != null ) { list.add( ah ); } if ( property != null ) { list.add( property ); } return new StructuredSelection( list ); } /** * {@inheritDoc} */ public void removeSelectionChangedListener( ISelectionChangedListener listener ) { if ( selectionChangesListenerList.contains( listener ) ) { selectionChangesListenerList.remove( listener ); } } /** * {@inheritDoc} */ public void setSelection( ISelection selection ) { } }