/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* 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
*
* Contributors:
* IBM Corporation - initial API and implementation
* Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.ui.editor.contentassist;
import org.eclipse.dltk.core.ISourceModule;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.dltk.ui.PreferenceConstants;
import org.eclipse.dltk.ui.text.completion.*;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.templates.TemplateCompletionProcessor;
import org.eclipse.php.internal.ui.editor.templates.PHPTemplateCompletionProcessor;
import org.eclipse.swt.widgets.Shell;
public class PHPCompletionProposalComputer extends ScriptCompletionProposalComputer {
private PHPCompletionProposalCollector phpCompletionProposalCollector;
private PHPTemplateCompletionProcessor phpTemplateCompletionProcessor;
@Override
protected TemplateCompletionProcessor createTemplateProposalComputer(ScriptContentAssistInvocationContext context) {
boolean explicit = false;
if (context instanceof PHPContentAssistInvocationContext) {
explicit = ((PHPContentAssistInvocationContext) context).isExplicit();
}
phpTemplateCompletionProcessor = new PHPTemplateCompletionProcessor(context, explicit);
return phpTemplateCompletionProcessor;
}
@Override
protected ScriptCompletionProposalCollector createCollector(ScriptContentAssistInvocationContext context) {
boolean explicit = false;
if (context instanceof PHPContentAssistInvocationContext) {
explicit = ((PHPContentAssistInvocationContext) context).isExplicit();
}
phpCompletionProposalCollector = new PHPCompletionProposalCollector(context.getDocument(),
context.getSourceModule(), explicit);
return phpCompletionProposalCollector;
}
@Override
protected int guessContextInformationPosition(ContentAssistInvocationContext context) {
IDocument document = context.getDocument();
int offset = context.getInvocationOffset();
int leftNumber = 0;
// if the cursor is at the end of the document
if (document.getLength() == offset) {
offset--;
}
try {
for (; offset > 0; --offset) {
if (document.getChar(offset) == '(') {
leftNumber++;
} else if (document.getChar(offset - 1) == ')') {
leftNumber--;
}
if (leftNumber == 1) {
return offset;
}
}
} catch (BadLocationException e) {
}
return super.guessContextInformationPosition(context);
}
private void handleCodeCompletionException(ModelException e, ScriptContentAssistInvocationContext context) {
ISourceModule module = context.getSourceModule();
Shell shell = context.getViewer().getTextWidget().getShell();
if (e.isDoesNotExist() && !module.getScriptProject().isOnBuildpath(module)) {
IPreferenceStore store = DLTKUIPlugin.getDefault().getPreferenceStore();
boolean value = store.getBoolean(PreferenceConstants.NOTIFICATION_NOT_ON_BUILDPATH_MESSAGE);
if (!value) {
MessageDialog.openInformation(shell, ScriptTextMessages.CompletionProcessor_error_notOnBuildPath_title,
ScriptTextMessages.CompletionProcessor_error_notOnBuildPath_message);
}
store.setValue(PreferenceConstants.NOTIFICATION_NOT_ON_BUILDPATH_MESSAGE, true);
} else
ErrorDialog.openError(shell, ScriptTextMessages.CompletionProcessor_error_accessing_title,
ScriptTextMessages.CompletionProcessor_error_accessing_message, e.getStatus());
}
@Override
public void sessionEnded() {
super.sessionEnded();
if (phpTemplateCompletionProcessor != null) {
phpTemplateCompletionProcessor.reset();
}
}
}