/*
* 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.controller;
import java.util.ArrayList;
import java.util.List;
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.actions.LinkWithEditorHierarchyViewAction;
import org.apache.directory.studio.schemaeditor.controller.actions.OpenHierarchyViewPreferencesAction;
import org.apache.directory.studio.schemaeditor.controller.actions.ShowSubtypeHierarchyAction;
import org.apache.directory.studio.schemaeditor.controller.actions.ShowSupertypeHierarchyAction;
import org.apache.directory.studio.schemaeditor.controller.actions.ShowTypeHierarchyAction;
import org.apache.directory.studio.schemaeditor.model.Project;
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.views.HierarchyView;
import org.apache.directory.studio.schemaeditor.view.wrappers.AttributeTypeWrapper;
import org.apache.directory.studio.schemaeditor.view.wrappers.ObjectClassWrapper;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
/**
* This class implements the Controller for the Hierarchy View
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
* @version $Rev$, $Date$
*/
public class HierarchyViewController
{
/** The associated view */
private HierarchyView view;
/** The authorized Preferences keys*/
List<String> authorizedPrefs;
/** The ProjectsHandlerListener */
private ProjectsHandlerListener projectsHandlerListener = new ProjectsHandlerAdapter()
{
public void openProjectChanged( Project oldProject, Project newProject )
{
// Since we're changing of project, let's set the input as null
view.setInput( null );
if ( newProject != null )
{
view.getViewer().getTree().setEnabled( true );
showTypeHierarchy.setEnabled( true );
showSupertypeHierarchy.setEnabled( true );
showSubtypeHierarchy.setEnabled( true );
linkWithEditor.setEnabled( true );
openPreferencePage.setEnabled( true );
}
else
{
view.getViewer().getTree().setEnabled( false );
showTypeHierarchy.setEnabled( false );
showSupertypeHierarchy.setEnabled( false );
showSubtypeHierarchy.setEnabled( false );
linkWithEditor.setEnabled( false );
openPreferencePage.setEnabled( false );
}
}
};
/** The IDoubleClickListener */
private IDoubleClickListener doubleClickListener = new IDoubleClickListener()
{
public void doubleClick( DoubleClickEvent event )
{
// What we get from the treeViewer is a StructuredSelection
StructuredSelection selection = ( StructuredSelection ) event.getSelection();
// Here's the real object (an AttributeTypeWrapper, ObjectClassWrapper or IntermediateNode)
Object objectSelection = selection.getFirstElement();
IEditorInput input = null;
String editorId = null;
// Selecting the right editor and input
if ( objectSelection instanceof AttributeTypeWrapper )
{
input = new AttributeTypeEditorInput( ( ( AttributeTypeWrapper ) objectSelection ).getAttributeType() );
editorId = AttributeTypeEditor.ID;
}
else if ( objectSelection instanceof ObjectClassWrapper )
{
input = new ObjectClassEditorInput( ( ( ObjectClassWrapper ) objectSelection ).getObjectClass() );
editorId = ObjectClassEditor.ID;
}
// Let's open the editor
if ( input != null )
{
IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
try
{
page.openEditor( input, editorId );
}
catch ( PartInitException e )
{
PluginUtils.logError( Messages.getString( "HierarchyViewController.ErrorOpeningEditor" ), e ); //$NON-NLS-1$
ViewUtils.displayErrorMessageBox( Messages.getString( "HierarchyViewController.Error" ), Messages //$NON-NLS-1$
.getString( "HierarchyViewController.ErrorOpeningEditor" ) ); //$NON-NLS-1$
}
}
}
};
/** The IPropertyChangeListener */
private IPropertyChangeListener propertyChangeListener = new IPropertyChangeListener()
{
public void propertyChange( PropertyChangeEvent event )
{
if ( authorizedPrefs.contains( event.getProperty() ) )
{
view.refresh();
}
}
};
// The Actions
private Action showTypeHierarchy;
private Action showSupertypeHierarchy;
private Action showSubtypeHierarchy;
private Action linkWithEditor;
private Action openPreferencePage;
/**
* Creates a new instance of SchemasViewController.
*
* @param view
* the associated view
*/
public HierarchyViewController( HierarchyView view )
{
this.view = view;
initAuthorizedPrefs();
initActions();
initToolbar();
initMenu();
initProjectsHandlerListener();
initDoubleClickListener();
initPreferencesListener();
initState();
}
/**
* Initializes the values for the authorized preferences.
*/
private void initAuthorizedPrefs()
{
authorizedPrefs = new ArrayList<String>();
authorizedPrefs.add( PluginConstants.PREFS_HIERARCHY_VIEW_LABEL );
authorizedPrefs.add( PluginConstants.PREFS_HIERARCHY_VIEW_ABBREVIATE );
authorizedPrefs.add( PluginConstants.PREFS_HIERARCHY_VIEW_ABBREVIATE_MAX_LENGTH );
authorizedPrefs.add( PluginConstants.PREFS_HIERARCHY_VIEW_SECONDARY_LABEL_DISPLAY );
authorizedPrefs.add( PluginConstants.PREFS_HIERARCHY_VIEW_SECONDARY_LABEL );
authorizedPrefs.add( PluginConstants.PREFS_HIERARCHY_VIEW_SECONDARY_LABEL_ABBREVIATE );
authorizedPrefs.add( PluginConstants.PREFS_HIERARCHY_VIEW_SECONDARY_LABEL_ABBREVIATE_MAX_LENGTH );
}
/**
* Initializes the Actions.
*/
private void initActions()
{
// Setting up the default key value (if needed)
if ( Activator.getDefault().getDialogSettings().get( PluginConstants.PREFS_HIERARCHY_VIEW_MODE ) == null )
{
Activator.getDefault().getDialogSettings().put( PluginConstants.PREFS_HIERARCHY_VIEW_MODE,
PluginConstants.PREFS_HIERARCHY_VIEW_MODE_TYPE );
}
showTypeHierarchy = new ShowTypeHierarchyAction( view );
showSupertypeHierarchy = new ShowSupertypeHierarchyAction( view );
showSubtypeHierarchy = new ShowSubtypeHierarchyAction( view );
linkWithEditor = new LinkWithEditorHierarchyViewAction( view );
openPreferencePage = new OpenHierarchyViewPreferencesAction();
}
/**
* Initializes the Toolbar.
*/
private void initToolbar()
{
IToolBarManager toolbar = view.getViewSite().getActionBars().getToolBarManager();
toolbar.add( showTypeHierarchy );
toolbar.add( showSupertypeHierarchy );
toolbar.add( showSubtypeHierarchy );
toolbar.add( new Separator() );
toolbar.add( linkWithEditor );
}
/**
* Initializes the Menu.
*/
private void initMenu()
{
IMenuManager menu = view.getViewSite().getActionBars().getMenuManager();
menu.add( showTypeHierarchy );
menu.add( showSupertypeHierarchy );
menu.add( showSubtypeHierarchy );
menu.add( new Separator() );
menu.add( linkWithEditor );
menu.add( new Separator() );
menu.add( openPreferencePage );
}
/**
* Initializes the ProjectsHandlerListener.
*/
private void initProjectsHandlerListener()
{
Activator.getDefault().getProjectsHandler().addListener( projectsHandlerListener );
}
/**
* Initializes the DoubleClickListener.
*/
private void initDoubleClickListener()
{
view.getViewer().addDoubleClickListener( doubleClickListener );
}
/**
* Initializes the listener on the preferences store.
*/
private void initPreferencesListener()
{
Activator.getDefault().getPreferenceStore().addPropertyChangeListener( propertyChangeListener );
}
/**
* Initializes the state of the View.
*/
private void initState()
{
if ( Activator.getDefault().getProjectsHandler().getOpenProject() != null )
{
view.getViewer().getTree().setEnabled( true );
showTypeHierarchy.setEnabled( true );
showSupertypeHierarchy.setEnabled( true );
showSubtypeHierarchy.setEnabled( true );
linkWithEditor.setEnabled( true );
openPreferencePage.setEnabled( true );
}
else
{
view.getViewer().getTree().setEnabled( false );
showTypeHierarchy.setEnabled( false );
showSupertypeHierarchy.setEnabled( false );
showSubtypeHierarchy.setEnabled( false );
linkWithEditor.setEnabled( false );
openPreferencePage.setEnabled( false );
}
}
/**
* This method is called when the view is disposed.
*/
public void dispose()
{
Activator.getDefault().getProjectsHandler().removeListener( projectsHandlerListener );
view.getViewer().removeDoubleClickListener( doubleClickListener );
Activator.getDefault().getPreferenceStore().removePropertyChangeListener( propertyChangeListener );
}
}