/*
* 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.views.browser;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.directory.studio.ldapbrowser.common.widgets.browser.BrowserConfiguration;
import org.apache.directory.studio.ldapbrowser.common.widgets.browser.BrowserWidget;
import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
import org.apache.directory.studio.ldapbrowser.core.model.IBookmark;
import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
import org.apache.directory.studio.ldapbrowser.core.model.ISearch;
import org.apache.directory.studio.ldapbrowser.core.model.ISearchResult;
import org.apache.directory.studio.ldapbrowser.core.model.IValue;
import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.IShowInTarget;
import org.eclipse.ui.part.ShowInContext;
import org.eclipse.ui.part.ViewPart;
/**
* This class implements the browser view. It displays the DIT, the searches and the bookmarks.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$, $Date$
*/
public class BrowserView extends ViewPart
{
/** The configuration */
private BrowserConfiguration configuration;
/** The listeners */
private BrowserViewUniversalListener universalListener;
/** The actions */
private BrowserViewActionGroup actionGroup;
/** The browser's main widget */
private BrowserWidget mainWidget;
// private DragAction dragAction;
// private DropAction dropAction;
/**
* Returns the browser view ID.
*
* @return the browser view ID.
*/
public static String getId()
{
return BrowserUIConstants.VIEW_BROWSER_VIEW;
}
/**
* Creates a new instance of BrowserView.
*/
public BrowserView()
{
}
/**
* {@inheritDoc}
*
* This implementation sets focus to the viewer's control.
*/
public void setFocus()
{
mainWidget.getViewer().getControl().setFocus();
}
/**
* {@inheritDoc}
*/
public void dispose()
{
if ( configuration != null )
{
actionGroup.dispose();
actionGroup = null;
universalListener.dispose();
universalListener = null;
configuration.dispose();
configuration = null;
mainWidget.dispose();
mainWidget = null;
getSite().setSelectionProvider( null );
}
super.dispose();
}
/**
* {@inheritDoc}
*/
public void createPartControl( Composite parent )
{
Composite composite = new Composite( parent, SWT.NONE );
composite.setLayoutData( new GridData( GridData.FILL_BOTH ) );
GridLayout layout = new GridLayout();
layout.marginWidth = 0;
layout.marginHeight = 0;
composite.setLayout( layout );
PlatformUI.getWorkbench().getHelpSystem().setHelp( composite,
BrowserUIConstants.PLUGIN_ID + "." + "tools_browser_view" ); //$NON-NLS-1$ //$NON-NLS-2$
// create configuration
configuration = new BrowserConfiguration();
// create main widget
mainWidget = new BrowserWidget( configuration, getViewSite().getActionBars() );
mainWidget.createWidget( composite );
mainWidget.setInput( getSite() );
// create actions and context menu (and register global actions)
actionGroup = new BrowserViewActionGroup( this );
actionGroup.fillToolBar( mainWidget.getToolBarManager() );
actionGroup.fillMenu( mainWidget.getMenuManager() );
actionGroup.enableGlobalActionHandlers( getViewSite().getActionBars() );
IMenuManager contextMenuManager = mainWidget.getContextMenuManager();
actionGroup.fillContextMenu( contextMenuManager );
getSite().registerContextMenu( ( MenuManager ) contextMenuManager, mainWidget.getViewer() );
// create the listener
getSite().setSelectionProvider( mainWidget.getViewer() );
universalListener = new BrowserViewUniversalListener( this );
// DND support
// int ops = DND.DROP_COPY | DND.DROP_MOVE;
// viewer.addDragSupport(ops, new Transfer[]{TextTransfer.getInstance(),
// BrowserTransfer.getInstance()}, this.dragAction);
// viewer.addDropSupport(ops, new
// Transfer[]{BrowserTransfer.getInstance()}, this.dropAction);
}
/**
* Selects the given object in the tree. The object
* must be an IEntry, ISearch, ISearchResult or IBookmark.
*
* @param obj the object to select
*/
public void select( Object obj )
{
Object objectToSelect = null;
if ( obj instanceof ISearch )
{
ISearch search = ( ISearch ) obj;
universalListener.setInput( search.getBrowserConnection() );
mainWidget.getViewer().expandToLevel( search, 0 );
objectToSelect = search;
}
if ( obj instanceof ISearchResult )
{
ISearchResult searchResult = ( ISearchResult ) obj;
ISearch search = searchResult.getSearch();
universalListener.setInput( search.getBrowserConnection() );
mainWidget.getViewer().expandToLevel( search, 1 );
objectToSelect = searchResult;
}
if ( obj instanceof IBookmark )
{
IBookmark bookmark = ( IBookmark ) obj;
universalListener.setInput( bookmark.getBrowserConnection() );
mainWidget.getViewer().expandToLevel( bookmark, 0 );
objectToSelect = bookmark;
}
if ( obj instanceof IEntry )
{
IEntry entry = ( IEntry ) obj;
universalListener.setInput( entry.getBrowserConnection() );
List<IEntry> entryList = new ArrayList<IEntry>();
IEntry tempEntry = entry;
while ( tempEntry.getParententry() != null )
{
IEntry parentEntry = tempEntry.getParententry();
entryList.add( 0, tempEntry );
tempEntry = parentEntry;
}
for ( IEntry childEntry : entryList )
{
IEntry parentEntry = childEntry.getParententry();
if ( !parentEntry.isChildrenInitialized() )
{
parentEntry.setChildrenInitialized( true );
parentEntry.setHasMoreChildren( true );
}
if ( !Arrays.asList( parentEntry.getChildren() ).contains( childEntry ) )
{
parentEntry.addChild( childEntry );
}
// force refresh of each parent, beginning from the root
// if the entry to select was lazy initialized then the
// JFace model has no knowledge about it so we must
// refresh the JFace model from the browser model
mainWidget.getViewer().refresh( parentEntry, true );
}
objectToSelect = entry;
}
if ( objectToSelect != null )
{
mainWidget.getViewer().reveal( objectToSelect );
mainWidget.getViewer().refresh( objectToSelect, true );
mainWidget.getViewer().setSelection( new StructuredSelection( objectToSelect ), true );
}
}
/**
* {@inheritDoc}
*/
public Object getAdapter( Class required )
{
if ( IShowInTarget.class.equals( required ) )
{
return new IShowInTarget()
{
public boolean show( ShowInContext context )
{
StructuredSelection selection = ( StructuredSelection ) context.getSelection();
Object obj = selection.getFirstElement();
if ( obj instanceof IValue )
{
IValue value = ( IValue ) obj;
IEntry entry = value.getAttribute().getEntry();
// The entry may be a clone, lookup original entry from entry cache.
// The result may be null, in that case the selection won't change.
entry = entry.getBrowserConnection().getEntryFromCache( entry.getDn() );
select( entry );
}
else if ( obj instanceof IAttribute )
{
IAttribute attribute = ( IAttribute ) obj;
IEntry entry = attribute.getEntry();
// The entry may be a clone, lookup original entry from entry cache.
// The result may be null, in that case the selection won't change.
entry = entry.getBrowserConnection().getEntryFromCache( entry.getDn() );
select( entry );
}
else if ( obj instanceof ISearchResult )
{
ISearchResult sr = ( ISearchResult ) obj;
ISearch search = sr.getSearch();
// The search may be a clone, lookup original search from search manager.
// The result may be null, in that case the selection won't change.
search = search.getBrowserConnection().getSearchManager().getSearch( search.getName() );
select( search );
}
return true;
}
};
}
return null;
}
/**
* Gets the action group.
*
* @return the action group
*/
public BrowserViewActionGroup getActionGroup()
{
return actionGroup;
}
/**
* Gets the configuration.
*
* @return the configuration
*/
public BrowserConfiguration getConfiguration()
{
return configuration;
}
/**
* Gets the main widget.
*
* @return the main widget
*/
public BrowserWidget getMainWidget()
{
return mainWidget;
}
/**
* Gets the universal listener.
*
* @return the universal listener
*/
public BrowserViewUniversalListener getUniversalListener()
{
return universalListener;
}
}