/******************************************************************************* * Copyright (c) 2007, 2008 Edgar Espina. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.deved.antlride.internal.ui.editor; import java.util.HashMap; import java.util.Map; import org.deved.antlride.common.ui.text.editor.AntlrBaseEditor; import org.deved.antlride.core.AntlrLanguageToolkit; import org.deved.antlride.core.build.AntlrSourceParserRepository; import org.deved.antlride.core.model.IGrammar; import org.deved.antlride.core.model.IModelElement; import org.deved.antlride.core.model.ast.AntlrModelElementLocator; import org.deved.antlride.core.resources.AntlrPackages; import org.deved.antlride.internal.ui.actions.AntlrGenerateActionGroup; import org.deved.antlride.internal.ui.preferences.AntlrBuilderPreferencesPage; import org.deved.antlride.internal.ui.text.AntlrTextTools; import org.deved.antlride.internal.ui.text.folding.AntlrFoldingStructureProvider; import org.deved.antlride.ui.AntlrPreferenceConstants; import org.deved.antlride.ui.AntlrUI; import org.deved.antlride.ui.AntlrUIConstants; import org.deved.antlride.ui.AntlrWorkbenchAdapter; import org.deved.antlride.ui.text.AntlrTextPartitions; import org.eclipse.core.filebuffers.IDocumentSetupParticipant; import org.eclipse.core.runtime.CoreException; import org.eclipse.dltk.core.IDLTKLanguageToolkit; import org.eclipse.dltk.core.ISourceModule; import org.eclipse.dltk.internal.ui.editor.ScriptOutlinePage; import org.eclipse.dltk.ui.text.folding.IFoldingStructureProvider; import org.eclipse.draw2d.ColorConstants; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.action.Separator; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.jface.util.PropertyChangeEvent; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.INavigationLocation; import org.eclipse.ui.IPartService; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.actions.ActionGroup; import org.eclipse.ui.dialogs.PreferencesUtil; import org.eclipse.ui.dialogs.PropertyDialogAction; import org.eclipse.ui.model.IWorkbenchAdapter; import org.eclipse.ui.texteditor.AbstractTextEditor; import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.ITextEditorActionConstants; import org.eclipse.ui.texteditor.TextSelectionNavigationLocation; public class AntlrEditor extends AntlrBaseEditor { public static final String EDITOR_CONTEXT_MENU_ID = "#AntlrEditorContext"; private class AntlrStructuredSelectionProvider implements ISelectionProvider { public void addSelectionChangedListener( ISelectionChangedListener listener) { } public ISelection getSelection() { IModelElement element = getSelectedElement(); if (element == null) return new StructuredSelection(); IWorkbenchAdapter workbenchAdapter = new AntlrWorkbenchAdapter( element); return new StructuredSelection(workbenchAdapter); } public void removeSelectionChangedListener( ISelectionChangedListener listener) { } public void setSelection(ISelection selection) { } } private class AntlrTextSelectionNavigationLocation extends TextSelectionNavigationLocation { public AntlrTextSelectionNavigationLocation(ITextEditor part, boolean initialize) { super(part, initialize); } @Override protected IEditorPart getEditorPart() { IEditorPart editorPart = super.getEditorPart(); AntlrEditor editor = null; if (editorPart != null) { editor = (AntlrEditor) editorPart.getAdapter(AntlrEditor.class); } return editor; } } public AntlrEditor() { } @Override public Object getAdapter(Class required) { if (required == AntlrEditor.class) { return this; } return super.getAdapter(required); } private IWorkbenchPart getActivePart() { IWorkbenchWindow window = getSite().getWorkbenchWindow(); IPartService service = window.getPartService(); IWorkbenchPart part = service.getActivePart(); return part; } @Override protected void doSetInput(IEditorInput input) throws CoreException { String[] packageNames = AntlrPackages.getAvailablePackageNames(); if (packageNames.length == 0) { Display.getDefault().asyncExec(new Runnable() { public void run() { // synchronized (lock) { while (getActivePart() == null) { try { Thread.sleep(200L); } catch (InterruptedException e) { e.printStackTrace(); } } AntlrEditor.this.setFocus(); String[] pkgs = AntlrPackages.getAvailablePackageNames(); if (pkgs.length == 0 && (getActivePart() instanceof AntlrMultiPageEditor)) { Shell shell = Display.getDefault().getActiveShell(); boolean yes = MessageDialog .openQuestion( shell, "No package defined", "In order to build your grammar you must to create an ANTLR package. Would you like to define one now?"); if (yes) { Map<String, Object> data = new HashMap<String, Object>(); data.put("PropertyAndPreferencePage.nolink", Boolean.TRUE); String id = AntlrBuilderPreferencesPage.PREFERENCE_PAGE_ID; PreferencesUtil.createPreferenceDialogOn(shell, id, new String[] { id }, data).open(); } } // } } }); } super.doSetInput(input); } @Override public void createActions() { super.createActions(); Action action = new PropertyDialogAction(getEditorSite(), new AntlrStructuredSelectionProvider());// new // AddBreakpointsActionDelegate(this); action.setText("ANTLR Breakpoints");//$NON-NLS-1$ setAction("AddBreakpointsAction", action); //$NON-NLS-1$ markAsStateDependentAction("AddBreakpointsAction", true); //$NON-NLS-1$ // action = new ToggleCommentAction(DLTKEditorMessages // .getBundleForConstructedKeys(), "ToggleComment.", this); //$NON-NLS-1$ // action // .setActionDefinitionId(IScriptEditorActionDefinitionIds.TOGGLE_COMMENT); // setAction("ToggleComment", action); //$NON-NLS-1$ // ((ToggleCommentAction) action).configure(getSourceViewer(), // getSourceViewerConfiguration()); // markAsStateDependentAction("ToggleComment", true); //$NON-NLS-1$ } protected ActionGroup createGenerateActionGroup() { return new AntlrGenerateActionGroup( this, ITextEditorActionConstants.GROUP_EDIT); } @Override public void editorContextMenuAboutToShow(IMenuManager menu) { super.editorContextMenuAboutToShow(menu); menu.insertBefore(ITextEditorActionConstants.GROUP_OPEN, new Separator( ITextEditorActionConstants.GROUP_GENERATE)); // menu.insertBefore(ITextEditorActionConstants.GROUP_OPEN, new // GroupMarker(ITextEditorActionConstants.GROUP_GENERATE)); IAction action = getAddBreakpointsAction(); // menu.appendToGroup(ITextEditorActionConstants.GROUP_GENERATE, new // Separator()); menu.appendToGroup(ITextEditorActionConstants.GROUP_GENERATE, action); } private IAction getAddBreakpointsAction() { return getAction("AddBreakpointsAction"); } @Override protected String getEditorContextId() { return AntlrUI.PLUGIN_ID + ".antlrEditorScope"; } @Override protected String getPartitionId() { return AntlrTextPartitions.ANTLR_PARTITIONING; } @Override protected IDocumentSetupParticipant createDocumentSetupParticipant() { return new AntlrDocumentSetupParticipant(); } @Override protected ScriptOutlinePage doCreateOutlinePage() { return new AntlrOutlinePage(this, getScriptPreferenceStore()); } @Override public String getEditorId() { return AntlrUIConstants.EDITOR_ID; } @Override protected void setPreferenceStore(IPreferenceStore store) { store.addPropertyChangeListener(new IPropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if (event.getProperty().equals( AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND)) { IPreferenceStore preferenceStore = AntlrUI.getDefault() .getPreferenceStore(); preferenceStore.setValue( AntlrPreferenceConstants.EDITOR_BACKGROUND_COLOR, event.getNewValue().toString()); } else if (event .getProperty() .equals( AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)) { IPreferenceStore preferenceStore = AntlrUI.getDefault() .getPreferenceStore(); PreferenceConverter.setValue(preferenceStore, AntlrPreferenceConstants.EDITOR_BACKGROUND_COLOR, ColorConstants.white.getRGB()); } } }); IPreferenceStore preferenceStore = AntlrUI.getDefault() .getPreferenceStore(); if (store .getBoolean(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND_SYSTEM_DEFAULT)) { PreferenceConverter.setValue(preferenceStore, AntlrPreferenceConstants.EDITOR_BACKGROUND_COLOR, ColorConstants.white.getRGB()); } else { preferenceStore .setValue( AntlrPreferenceConstants.EDITOR_BACKGROUND_COLOR, store .getString(AbstractTextEditor.PREFERENCE_COLOR_BACKGROUND)); } super.setPreferenceStore(store); } @Override protected IFoldingStructureProvider createFoldingStructureProvider() { return new AntlrFoldingStructureProvider(/* this */); } private IModelElement getSelectedElement() { TextSelection textSelection = (TextSelection) getSelectionProvider() .getSelection(); ISourceModule sourceModule = getSourceModule(); IGrammar grammar = AntlrSourceParserRepository.getGrammar(sourceModule); AntlrModelElementLocator locator = new AntlrModelElementLocator(grammar); IModelElement element = locator.getElementAt(textSelection.getOffset()); return element; } @Override public IDLTKLanguageToolkit getLanguageToolkit() { return AntlrLanguageToolkit.getDefault(); } @Override public IPreferenceStore getScriptPreferenceStore() { return AntlrUI.getDefault().getPreferenceStore(); } @Override public AntlrTextTools getTextTools() { return AntlrUI.getDefault().getTextTools(); } @Override protected String getPairMatcherCharacters() { return "{}()[]"; } @Override protected String getContextMenuId() { return EDITOR_CONTEXT_MENU_ID; } @Override public INavigationLocation createEmptyNavigationLocation() { return new AntlrTextSelectionNavigationLocation(this, false); } @Override public INavigationLocation createNavigationLocation() { return new AntlrTextSelectionNavigationLocation(this, true); } }