Java tutorial
/* * 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.api.ldap.model.schema.AttributeType; import org.apache.directory.api.ldap.model.schema.ObjectClass; 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.CollapseAllAction; import org.apache.directory.studio.schemaeditor.controller.actions.DeleteSchemaElementAction; import org.apache.directory.studio.schemaeditor.controller.actions.ExportSchemasAsOpenLdapAction; import org.apache.directory.studio.schemaeditor.controller.actions.ExportSchemasAsXmlAction; import org.apache.directory.studio.schemaeditor.controller.actions.ExportSchemasForADSAction; import org.apache.directory.studio.schemaeditor.controller.actions.ImportCoreSchemasAction; import org.apache.directory.studio.schemaeditor.controller.actions.ImportSchemasFromOpenLdapAction; import org.apache.directory.studio.schemaeditor.controller.actions.ImportSchemasFromXmlAction; import org.apache.directory.studio.schemaeditor.controller.actions.LinkWithEditorSchemaViewAction; import org.apache.directory.studio.schemaeditor.controller.actions.MergeSchemasAction; import org.apache.directory.studio.schemaeditor.controller.actions.NewAttributeTypeAction; import org.apache.directory.studio.schemaeditor.controller.actions.NewObjectClassAction; import org.apache.directory.studio.schemaeditor.controller.actions.NewSchemaAction; import org.apache.directory.studio.schemaeditor.controller.actions.OpenElementAction; import org.apache.directory.studio.schemaeditor.controller.actions.OpenSchemaViewPreferenceAction; import org.apache.directory.studio.schemaeditor.controller.actions.OpenSchemaViewSortingDialogAction; import org.apache.directory.studio.schemaeditor.controller.actions.OpenTypeHierarchyAction; import org.apache.directory.studio.schemaeditor.controller.actions.RenameSchemaElementAction; import org.apache.directory.studio.schemaeditor.controller.actions.SwitchSchemaPresentationToFlatAction; import org.apache.directory.studio.schemaeditor.controller.actions.SwitchSchemaPresentationToHierarchicalAction; import org.apache.directory.studio.schemaeditor.model.Project; import org.apache.directory.studio.schemaeditor.model.Schema; import org.apache.directory.studio.schemaeditor.model.schemachecker.SchemaCheckerListener; 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.SchemaView; import org.apache.directory.studio.schemaeditor.view.views.SchemaViewContentProvider; import org.apache.directory.studio.schemaeditor.view.wrappers.AttributeTypeWrapper; import org.apache.directory.studio.schemaeditor.view.wrappers.Folder; import org.apache.directory.studio.schemaeditor.view.wrappers.ObjectClassWrapper; import org.apache.directory.studio.schemaeditor.view.wrappers.SchemaWrapper; import org.apache.directory.studio.schemaeditor.view.wrappers.TreeNode; import org.eclipse.jface.action.IMenuListener; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.IToolBarManager; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.commands.ActionHandler; 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.ISelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IPartListener2; import org.eclipse.ui.IWorkbenchActionConstants; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPartReference; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.commands.ICommandService; import org.eclipse.ui.contexts.IContextActivation; import org.eclipse.ui.contexts.IContextService; /** * This class implements the Controller for the SchemaView. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class SchemaViewController { /** The associated view */ private SchemaView view; /** The TreeViewer */ private TreeViewer viewer; /** The authorized Preferences keys*/ private List<String> authorizedPrefs; /** The Context Menu */ private MenuManager contextMenu; /** The selection */ private ISelection selection; /** The SchemaHandlerListener */ private SchemaHandlerListener schemaHandlerListener = new SchemaHandlerAdapter() { /** * {@inheritDoc} */ public void attributeTypeAdded(AttributeType at) { SchemaViewContentProvider contentProvider = (SchemaViewContentProvider) viewer.getContentProvider(); contentProvider.attributeTypeAdded(at); TreeNode wrapper = contentProvider.getWrapper(at); if (wrapper != null) { selection = new StructuredSelection(wrapper); } } /** * {@inheritDoc} */ public void attributeTypeModified(AttributeType at) { ((SchemaViewContentProvider) viewer.getContentProvider()).attributeTypeModified(at); } /** * {@inheritDoc} */ public void attributeTypeRemoved(AttributeType at) { ((SchemaViewContentProvider) viewer.getContentProvider()).attributeTypeRemoved(at); } /** * {@inheritDoc} */ public void objectClassAdded(ObjectClass oc) { SchemaViewContentProvider contentProvider = (SchemaViewContentProvider) viewer.getContentProvider(); contentProvider.objectClassAdded(oc); TreeNode wrapper = contentProvider.getWrapper(oc); if (wrapper != null) { selection = new StructuredSelection(wrapper); } } /** * {@inheritDoc} */ public void objectClassModified(ObjectClass oc) { ((SchemaViewContentProvider) viewer.getContentProvider()).objectClassModified(oc); } /** * {@inheritDoc} */ public void objectClassRemoved(ObjectClass oc) { ((SchemaViewContentProvider) viewer.getContentProvider()).objectClassRemoved(oc); } /** * {@inheritDoc} */ public void schemaAdded(Schema schema) { SchemaViewContentProvider contentProvider = (SchemaViewContentProvider) viewer.getContentProvider(); contentProvider.schemaAdded(schema); TreeNode wrapper = contentProvider.getWrapper(schema); if (wrapper != null) { selection = new StructuredSelection(wrapper); } } /** * {@inheritDoc} */ public void schemaRemoved(Schema schema) { ((SchemaViewContentProvider) viewer.getContentProvider()).schemaRemoved(schema); } /** * {@inheritDoc} */ public void schemaRenamed(Schema schema) { view.refresh(); } }; /** The SchemaCheckerListener */ private SchemaCheckerListener schemaCheckerListener = new SchemaCheckerListener() { public void schemaCheckerUpdated() { Display.getDefault().asyncExec(new Runnable() { public void run() { if (selection != null) { view.refresh(selection); selection = null; } else { view.refresh(); } } }); } }; /** Token used to activate and deactivate shortcuts in the view */ private IContextActivation contextActivation; // The Actions private NewSchemaAction newSchema; private NewAttributeTypeAction newAttributeType; private NewObjectClassAction newObjectClass; private OpenElementAction openElement; private OpenTypeHierarchyAction openTypeHierarchy; private DeleteSchemaElementAction deleteSchemaElement; private RenameSchemaElementAction renameSchemaElement; private ImportCoreSchemasAction importCoreSchemas; private ImportSchemasFromOpenLdapAction importSchemasFromOpenLdap; private ImportSchemasFromXmlAction importSchemasFromXml; private ExportSchemasAsOpenLdapAction exportSchemasAsOpenLdap; private ExportSchemasAsXmlAction exportSchemasAsXml; private ExportSchemasForADSAction exportSchemasForADS; private CollapseAllAction collapseAll; private OpenSchemaViewSortingDialogAction openSchemaViewSortingDialog; private SwitchSchemaPresentationToFlatAction switchSchemaPresentationToFlat; private SwitchSchemaPresentationToHierarchicalAction switchSchemaPresentationToHierarchical; private OpenSchemaViewPreferenceAction openSchemaViewPreference; private LinkWithEditorSchemaViewAction linkWithEditor; private MergeSchemasAction mergeSchema; // private CommitChangesAction commitChanges; /** * Creates a new instance of SchemasViewController. * * @param view * the associated view */ public SchemaViewController(SchemaView view) { this.view = view; viewer = view.getViewer(); initActions(); initToolbar(); initMenu(); initContextMenu(); initProjectsHandlerListener(); initSchemaCheckerListener(); initDoubleClickListener(); initAuthorizedPrefs(); initPreferencesListener(); initState(); initPartListener(); } /** * Initializes the Actions. */ private void initActions() { newSchema = new NewSchemaAction(); newAttributeType = new NewAttributeTypeAction(viewer); newObjectClass = new NewObjectClassAction(viewer); openElement = new OpenElementAction(viewer); openTypeHierarchy = new OpenTypeHierarchyAction(viewer); deleteSchemaElement = new DeleteSchemaElementAction(viewer); renameSchemaElement = new RenameSchemaElementAction(viewer); importCoreSchemas = new ImportCoreSchemasAction(); importSchemasFromOpenLdap = new ImportSchemasFromOpenLdapAction(); importSchemasFromXml = new ImportSchemasFromXmlAction(); exportSchemasAsOpenLdap = new ExportSchemasAsOpenLdapAction(viewer); exportSchemasAsXml = new ExportSchemasAsXmlAction(viewer); exportSchemasForADS = new ExportSchemasForADSAction(viewer); collapseAll = new CollapseAllAction(viewer); openSchemaViewSortingDialog = new OpenSchemaViewSortingDialogAction(); switchSchemaPresentationToFlat = new SwitchSchemaPresentationToFlatAction(); switchSchemaPresentationToHierarchical = new SwitchSchemaPresentationToHierarchicalAction(); openSchemaViewPreference = new OpenSchemaViewPreferenceAction(); linkWithEditor = new LinkWithEditorSchemaViewAction(view); mergeSchema = new MergeSchemasAction(); // commitChanges = new CommitChangesAction(); } /** * Initializes the Toolbar. */ private void initToolbar() { IToolBarManager toolbar = view.getViewSite().getActionBars().getToolBarManager(); toolbar.add(newSchema); toolbar.add(newAttributeType); toolbar.add(newObjectClass); // toolbar.add( new Separator() ); // toolbar.add( commitChanges ); toolbar.add(new Separator()); toolbar.add(collapseAll); toolbar.add(linkWithEditor); } /** * Initializes the Menu. */ private void initMenu() { IMenuManager menu = view.getViewSite().getActionBars().getMenuManager(); menu.add(openSchemaViewSortingDialog); menu.add(new Separator()); IMenuManager schemaPresentationMenu = new MenuManager( Messages.getString("SchemaViewController.SchemaPresentationAction")); //$NON-NLS-1$ schemaPresentationMenu.add(switchSchemaPresentationToFlat); schemaPresentationMenu.add(switchSchemaPresentationToHierarchical); menu.add(schemaPresentationMenu); menu.add(new Separator()); menu.add(linkWithEditor); menu.add(new Separator()); menu.add(openSchemaViewPreference); } /** * Initializes the ContextMenu. */ private void initContextMenu() { contextMenu = new MenuManager(""); //$NON-NLS-1$ contextMenu.setRemoveAllWhenShown(true); contextMenu.addMenuListener(new IMenuListener() { public void menuAboutToShow(IMenuManager manager) { MenuManager newManager = new MenuManager(Messages.getString("SchemaViewController.NewAction")); //$NON-NLS-1$ MenuManager importManager = new MenuManager( Messages.getString("SchemaViewController.ImportAction")); //$NON-NLS-1$ MenuManager exportManager = new MenuManager( Messages.getString("SchemaViewController.ExportAction")); //$NON-NLS-1$ manager.add(newManager); newManager.add(newSchema); newManager.add(newAttributeType); newManager.add(newObjectClass); manager.add(new Separator()); manager.add(openElement); manager.add(openTypeHierarchy); manager.add(new Separator()); manager.add(deleteSchemaElement); manager.add(new Separator()); manager.add(renameSchemaElement); manager.add(new Separator()); manager.add(importManager); importManager.add(importCoreSchemas); importManager.add(new Separator()); importManager.add(importSchemasFromOpenLdap); importManager.add(importSchemasFromXml); importManager.add(new Separator()); importManager.add(mergeSchema); manager.add(exportManager); exportManager.add(exportSchemasAsOpenLdap); exportManager.add(exportSchemasAsXml); exportManager.add(new Separator()); exportManager.add(exportSchemasForADS); manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); } }); // set the context menu to the table viewer viewer.getControl().setMenu(contextMenu.createContextMenu(viewer.getControl())); // register the context menu to enable extension actions view.getSite().registerContextMenu(contextMenu, viewer); } /** * Initializes the ProjectsHandlerListener. */ private void initProjectsHandlerListener() { Activator.getDefault().getProjectsHandler().addListener(new ProjectsHandlerAdapter() { public void openProjectChanged(Project oldProject, Project newProject) { if (oldProject != null) { removeSchemaHandlerListener(oldProject); } if (newProject != null) { viewer.getTree().setEnabled(true); newSchema.setEnabled(true); newAttributeType.setEnabled(true); newObjectClass.setEnabled(true); collapseAll.setEnabled(true); linkWithEditor.setEnabled(true); openSchemaViewSortingDialog.setEnabled(true); switchSchemaPresentationToFlat.setEnabled(true); switchSchemaPresentationToHierarchical.setEnabled(true); openSchemaViewPreference.setEnabled(true); // commitChanges.setEnabled( true ); addSchemaHandlerListener(newProject); view.reloadViewer(); } else { viewer.setInput(null); viewer.getTree().setEnabled(false); newSchema.setEnabled(false); newAttributeType.setEnabled(false); newObjectClass.setEnabled(false); collapseAll.setEnabled(false); linkWithEditor.setEnabled(false); openSchemaViewSortingDialog.setEnabled(false); switchSchemaPresentationToFlat.setEnabled(false); switchSchemaPresentationToHierarchical.setEnabled(false); openSchemaViewPreference.setEnabled(false); // commitChanges.setEnabled( false ); } } }); } /** * Adds the SchemaHandlerListener. * * @param project * the project */ private void addSchemaHandlerListener(Project project) { SchemaHandler schemaHandler = project.getSchemaHandler(); if (schemaHandler != null) { schemaHandler.addListener(schemaHandlerListener); } } /** * Removes the SchemaHandlerListener. * * @param project * the project */ private void removeSchemaHandlerListener(Project project) { SchemaHandler schemaHandler = project.getSchemaHandler(); if (schemaHandler != null) { schemaHandler.removeListener(schemaHandlerListener); } } /** * Intializes the schema checker listener. */ private void initSchemaCheckerListener() { Activator.getDefault().getSchemaChecker().addListener(schemaCheckerListener); } /** * Initializes the DoubleClickListener. */ private void initDoubleClickListener() { viewer.addDoubleClickListener(new IDoubleClickListener() { public void doubleClick(DoubleClickEvent event) { IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage(); TreeViewer viewer = view.getViewer(); // What we get from the viewer 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; } else if ((objectSelection instanceof Folder) || (objectSelection instanceof SchemaWrapper)) { // Here we don't open an editor, we just expand the node. viewer.setExpandedState(objectSelection, !viewer.getExpandedState(objectSelection)); } // Let's open the editor if (input != null) { try { page.openEditor(input, editorId); } catch (PartInitException e) { PluginUtils.logError(Messages.getString("SchemaViewController.ErrorOpeningEditor"), e); //$NON-NLS-1$ ViewUtils.displayErrorMessageDialog(Messages.getString("SchemaViewController.error"), //$NON-NLS-1$ Messages.getString("SchemaViewController.ErrorOpeningEditor")); //$NON-NLS-1$ } } } }); } /** * Initializes the Authorized Prefs IDs. */ private void initAuthorizedPrefs() { authorizedPrefs = new ArrayList<String>(); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_LABEL); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_ABBREVIATE); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_ABBREVIATE_MAX_LENGTH); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_SECONDARY_LABEL_DISPLAY); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_SECONDARY_LABEL); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_SECONDARY_LABEL_ABBREVIATE); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_SECONDARY_LABEL_ABBREVIATE_MAX_LENGTH); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_GROUPING); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_SORTING_BY); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_SORTING_ORDER); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_SCHEMA_PRESENTATION); authorizedPrefs.add(PluginConstants.PREFS_SCHEMA_VIEW_SCHEMA_LABEL_DISPLAY); } /** * Initializes the listener on the preferences store */ private void initPreferencesListener() { Activator.getDefault().getPreferenceStore().addPropertyChangeListener(new IPropertyChangeListener() { /** * {@inheritDoc} */ public void propertyChange(PropertyChangeEvent event) { if (authorizedPrefs.contains(event.getProperty())) { if (PluginConstants.PREFS_SCHEMA_VIEW_GROUPING.equals(event.getProperty()) || PluginConstants.PREFS_SCHEMA_VIEW_SCHEMA_PRESENTATION.equals(event.getProperty())) { view.reloadViewer(); } else { view.refresh(); } } } }); } /** * Initializes the state of the View. */ private void initState() { Project project = Activator.getDefault().getProjectsHandler().getOpenProject(); if (project != null) { viewer.getTree().setEnabled(true); newSchema.setEnabled(true); newAttributeType.setEnabled(true); newObjectClass.setEnabled(true); collapseAll.setEnabled(true); linkWithEditor.setEnabled(true); openSchemaViewSortingDialog.setEnabled(true); switchSchemaPresentationToFlat.setEnabled(true); switchSchemaPresentationToHierarchical.setEnabled(true); openSchemaViewPreference.setEnabled(true); // commitChanges.setEnabled( true ); addSchemaHandlerListener(project); view.reloadViewer(); } else { viewer.getTree().setEnabled(false); newSchema.setEnabled(false); newAttributeType.setEnabled(false); newObjectClass.setEnabled(false); collapseAll.setEnabled(false); linkWithEditor.setEnabled(false); openSchemaViewSortingDialog.setEnabled(false); switchSchemaPresentationToFlat.setEnabled(false); switchSchemaPresentationToHierarchical.setEnabled(false); openSchemaViewPreference.setEnabled(false); // commitChanges.setEnabled( false ); } } /** * Initializes the PartListener. */ private void initPartListener() { view.getSite().getPage().addPartListener(new IPartListener2() { /** * This implementation deactivates the shortcuts when the part is deactivated. */ public void partDeactivated(IWorkbenchPartReference partRef) { if (partRef.getPart(false) == view && contextActivation != null) { ICommandService commandService = (ICommandService) PlatformUI.getWorkbench() .getAdapter(ICommandService.class); if (commandService != null) { commandService.getCommand(newSchema.getActionDefinitionId()).setHandler(null); commandService.getCommand(newAttributeType.getActionDefinitionId()).setHandler(null); commandService.getCommand(newObjectClass.getActionDefinitionId()).setHandler(null); commandService.getCommand(openElement.getActionDefinitionId()).setHandler(null); commandService.getCommand(openTypeHierarchy.getActionDefinitionId()).setHandler(null); commandService.getCommand(deleteSchemaElement.getActionDefinitionId()).setHandler(null); commandService.getCommand(renameSchemaElement.getActionDefinitionId()).setHandler(null); } IContextService contextService = (IContextService) PlatformUI.getWorkbench() .getAdapter(IContextService.class); contextService.deactivateContext(contextActivation); contextActivation = null; } } /** * This implementation activates the shortcuts when the part is activated. */ public void partActivated(IWorkbenchPartReference partRef) { if (partRef.getPart(false) == view) { IContextService contextService = (IContextService) PlatformUI.getWorkbench() .getAdapter(IContextService.class); contextActivation = contextService.activateContext(PluginConstants.CONTEXT_SCHEMA_VIEW); ICommandService commandService = (ICommandService) PlatformUI.getWorkbench() .getAdapter(ICommandService.class); if (commandService != null) { commandService.getCommand(newSchema.getActionDefinitionId()) .setHandler(new ActionHandler(newSchema)); commandService.getCommand(newAttributeType.getActionDefinitionId()) .setHandler(new ActionHandler(newAttributeType)); commandService.getCommand(newObjectClass.getActionDefinitionId()) .setHandler(new ActionHandler(newObjectClass)); commandService.getCommand(openElement.getActionDefinitionId()) .setHandler(new ActionHandler(openElement)); commandService.getCommand(openTypeHierarchy.getActionDefinitionId()) .setHandler(new ActionHandler(openTypeHierarchy)); commandService.getCommand(deleteSchemaElement.getActionDefinitionId()) .setHandler(new ActionHandler(deleteSchemaElement)); commandService.getCommand(renameSchemaElement.getActionDefinitionId()) .setHandler(new ActionHandler(renameSchemaElement)); } } } public void partBroughtToTop(IWorkbenchPartReference partRef) { } public void partClosed(IWorkbenchPartReference partRef) { } public void partHidden(IWorkbenchPartReference partRef) { } public void partInputChanged(IWorkbenchPartReference partRef) { } public void partOpened(IWorkbenchPartReference partRef) { } public void partVisible(IWorkbenchPartReference partRef) { } }); } }