blob: 31e69147ad23a95c9964980e0f8fbb031d64ae08 [file] [log] [blame]
/*=============================================================================#
# Copyright (c) 2009, 2020 Stephan Wahlbrink and others.
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License 2.0 which is available at
# https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
# which is available at https://www.apache.org/licenses/LICENSE-2.0.
#
# SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
#
# Contributors:
# Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
#=============================================================================*/
package org.eclipse.statet.ltk.ui.sourceediting;
import java.util.Arrays;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.text.IRegion;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.ui.IWorkbenchCommandConstants;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.menus.CommandContributionItem;
import org.eclipse.ui.menus.CommandContributionItemParameter;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.services.IServiceLocator;
import org.eclipse.statet.ecommons.ui.SharedUIResources;
import org.eclipse.statet.ecommons.ui.actions.HandlerCollection;
import org.eclipse.statet.internal.ltk.ui.EditingMessages;
import org.eclipse.statet.ltk.model.core.elements.ISourceStructElement;
import org.eclipse.statet.ltk.refactoring.core.CommonRefactoringFactory;
import org.eclipse.statet.ltk.refactoring.core.RefactoringAdapter;
import org.eclipse.statet.ltk.ui.refactoring.AbstractElementsHandler;
import org.eclipse.statet.ltk.ui.refactoring.CopyElementsHandler;
import org.eclipse.statet.ltk.ui.refactoring.CopyNamesHandler;
import org.eclipse.statet.ltk.ui.refactoring.CutElementsHandler;
import org.eclipse.statet.ltk.ui.refactoring.DeleteElementsHandler;
import org.eclipse.statet.ltk.ui.refactoring.PasteElementsHandler;
import org.eclipse.statet.ltk.ui.util.LTKSelectionUtils;
public abstract class SourceEditor2OutlinePage extends SourceEditor1OutlinePage {
protected class SelectCodeRangeAction extends Action {
public SelectCodeRangeAction(final CommonRefactoringFactory refactoring) {
super();
setText(EditingMessages.SelectSourceCode_label);
setEnabled(!getSelection().isEmpty());
}
@Override
public void run() {
final ISourceStructElement[] elements= LTKSelectionUtils.getSelectedSourceStructElements(getSelection());
if (elements != null) {
RefactoringAdapter adapter= SourceEditor2OutlinePage.this.refactoring.createAdapter(elements);
if (adapter == null) {
adapter= SourceEditor2OutlinePage.this.refactoring.createAdapter(null);
}
Arrays.sort(elements, adapter.getModelElementComparator());
final IRegion range= adapter.getContinuousSourceRange(elements);
if (range != null) {
selectInEditor(new TextSelection(range.getOffset(), range.getLength()));
}
}
}
}
private final CommonRefactoringFactory refactoring;
public SourceEditor2OutlinePage(final SourceEditor1 editor, final String mainType,
final CommonRefactoringFactory refactoring, final String contextMenuId) {
super(editor, mainType, contextMenuId);
this.refactoring= refactoring;
}
protected CommonRefactoringFactory getRefactoringFactory() {
return this.refactoring;
}
@Override
protected void initActions(final IServiceLocator serviceLocator, final HandlerCollection handlers) {
super.initActions(serviceLocator, handlers);
final IHandlerService handlerService= serviceLocator.getService(IHandlerService.class);
{ final AbstractElementsHandler handler= new CutElementsHandler(this.refactoring);
handlers.add(IWorkbenchCommandConstants.EDIT_CUT, handler);
registerHandlerToUpdate(handler);
handlerService.activateHandler(IWorkbenchCommandConstants.EDIT_CUT, handler);
}
{ final AbstractElementsHandler handler= new CopyElementsHandler(this.refactoring);
handlers.add(IWorkbenchCommandConstants.EDIT_COPY, handler);
registerHandlerToUpdate(handler);
handlerService.activateHandler(IWorkbenchCommandConstants.EDIT_COPY, handler);
}
{ final AbstractElementsHandler handler= new CopyNamesHandler(this.refactoring);
handlers.add(ISourceEditorCommandIds.COPY_ELEMENT_NAME, handler);
registerHandlerToUpdate(handler);
handlerService.activateHandler(ISourceEditorCommandIds.COPY_ELEMENT_NAME, handler);
}
{ final AbstractElementsHandler handler= new PasteElementsHandler(getSourceEditor(), this.refactoring);
handlers.add(IWorkbenchCommandConstants.EDIT_PASTE, handler);
handlerService.activateHandler(IWorkbenchCommandConstants.EDIT_PASTE, handler);
}
{ final AbstractElementsHandler handler= new DeleteElementsHandler(this.refactoring);
handlers.add(IWorkbenchCommandConstants.EDIT_DELETE, handler);
handlerService.activateHandler(IWorkbenchCommandConstants.EDIT_DELETE, handler);
}
}
@Override
protected void contextMenuAboutToShow(final IMenuManager m) {
final IPageSite site= getSite();
m.add(new SelectCodeRangeAction(this.refactoring));
m.add(new Separator(SharedUIResources.EDIT_COPYPASTE_MENU_ID));
m.add(new CommandContributionItem(new CommandContributionItemParameter(
site, null, IWorkbenchCommandConstants.EDIT_CUT, CommandContributionItem.STYLE_PUSH)));
m.add(new CommandContributionItem(new CommandContributionItemParameter(
site, null, IWorkbenchCommandConstants.EDIT_COPY, CommandContributionItem.STYLE_PUSH)));
m.add(new CommandContributionItem(new CommandContributionItemParameter(
site, null, ISourceEditorCommandIds.COPY_ELEMENT_NAME, CommandContributionItem.STYLE_PUSH)));
m.add(new CommandContributionItem(new CommandContributionItemParameter(
site, null, IWorkbenchCommandConstants.EDIT_PASTE, CommandContributionItem.STYLE_PUSH)));
super.contextMenuAboutToShow(m);
}
}