/*******************************************************************************
* Copyright (c) 2007 Business Objects Software Limited and others.
* All rights reserved.
* This file is 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
*
* Contributors:
* Business Objects Software Limited - initial API and implementation
*******************************************************************************/
/*
* GotoElementAction.java
* Creation date: Sept 12, 2007
* By: Greg McClement
*/
package org.openquark.cal.eclipse.ui.actions;
import java.util.ResourceBundle;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.ITextSelection;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.FileEditorInput;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.TextEditorAction;
import org.openquark.cal.compiler.CompilerMessageLogger;
import org.openquark.cal.compiler.MessageLogger;
import org.openquark.cal.compiler.ModuleName;
import org.openquark.cal.compiler.SourceMetricsManager;
import org.openquark.cal.compiler.SourceRange;
import org.openquark.cal.eclipse.core.CALModelManager;
import org.openquark.cal.eclipse.ui.CALEclipseUIPlugin;
import org.openquark.cal.eclipse.ui.actions.ActionMessages;
import org.openquark.cal.eclipse.ui.actions.ActionUtilities;
import org.openquark.cal.eclipse.ui.caleditor.CALEditor;
import org.openquark.cal.eclipse.ui.util.CoreUtility;
import org.openquark.cal.eclipse.ui.util.Messages;
/**
* This class implements to goto next/previous element action that
* will move the cursor to the name of the next/previous element
* defined in the current module.
*
* @author Greg McClement
*/
public class GotoElementAction extends TextEditorAction{
private final SourceMetricsManager sourceMetrics;
private final Direction direction;
public enum Direction {Previous, Next};
private final String errorTitle = ActionMessages.OpenDeclarationAction_error_title;
public GotoElementAction(ResourceBundle bundle, String prefix, ITextEditor editor, Direction direction) {
super(bundle, prefix, editor);
this.direction = direction;
CALModelManager modelManager = CALModelManager.getCALModelManager();
sourceMetrics = modelManager.getSourceMetrics();
}
/*
* @see org.eclipse.jface.action.Action#run()
*/
@Override
public void run() {
// update has been called by the framework
if (!isEnabled())
return;
if (!CoreUtility.builderEnabledCheck(errorTitle)){
return;
}
final CALEditor textEditor = (CALEditor) getTextEditor();
final ITextSelection selection = ActionUtilities.getSelection(textEditor);
final IDocument document = ActionUtilities.getDocument(textEditor);
if (document != null) {
final int offset = selection.getOffset();
try {
CoreUtility.initializeCALBuilder(null, 100, 100);
final int firstLine = document.getLineOfOffset(offset);
final int column = offset - document.getLineOffset(firstLine);
CALModelManager cmm = CALModelManager.getCALModelManager();
FileEditorInput ei = (FileEditorInput) textEditor.getEditorInput();
final IFile memberFile = ei.getFile();
ModuleName moduleName = cmm.getModuleName(memberFile);
if (moduleName == null){
final String errorMessage = Messages.format(ActionMessages.error_invalidFileName_message, textEditor.getStorage().getName());
CoreUtility.showMessage(errorTitle, errorMessage, IStatus.ERROR);
return;
}
CompilerMessageLogger messageLogger = new MessageLogger();
final SourceRange range;
if (direction == Direction.Previous){
range = sourceMetrics.findPreviousTopLevelElement(moduleName, firstLine+1, column+1, messageLogger);
}
else if (direction == Direction.Next){
range = sourceMetrics.findNextTopLevelElement(moduleName, firstLine+1, column+1, messageLogger);
}
else{
throw new IllegalArgumentException();
}
if (range != null){
IStorage definitionFile = cmm.getInputSourceFile(moduleName);
IEditorPart editorPart = CoreUtility.openInEditor(definitionFile, true);
CoreUtility.showPosition(editorPart, definitionFile, range, true);
}
} catch (BadLocationException e) {
// will only happen on concurrent modification
CALEclipseUIPlugin.log(new Status(IStatus.ERROR, CALEclipseUIPlugin.PLUGIN_ID, IStatus.OK, "", e)); //$NON-NLS-1$
return;
} catch (PartInitException e) {
CALEclipseUIPlugin.log(new Status(IStatus.ERROR, CALEclipseUIPlugin.PLUGIN_ID, IStatus.OK, "", e)); //$NON-NLS-1$
return;
}
}
}
}