X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.phphelp/src/net/sourceforge/phpdt/httpquery/AbstractHTTPQueryAction.java b/net.sourceforge.phpeclipse.phphelp/src/net/sourceforge/phpdt/httpquery/AbstractHTTPQueryAction.java new file mode 100644 index 0000000..6d36486 --- /dev/null +++ b/net.sourceforge.phpeclipse.phphelp/src/net/sourceforge/phpdt/httpquery/AbstractHTTPQueryAction.java @@ -0,0 +1,138 @@ +package net.sourceforge.phpdt.httpquery; + +import net.sourceforge.phpdt.httpquery.config.Configuration; +import net.sourceforge.phpeclipse.webbrowser.views.BrowserView; + +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.jface.text.IDocument; +import org.eclipse.jface.text.ITextSelection; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.ui.IEditorActionDelegate; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IViewPart; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.texteditor.AbstractTextEditor; + +public abstract class AbstractHTTPQueryAction implements IEditorActionDelegate { + + private AbstractTextEditor editor; + + public AbstractHTTPQueryAction() { + super(); + } + + abstract protected Configuration getConfiguration(); + + public void setActiveEditor(IAction action, IEditorPart targetEditor) { + if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) { + editor = (AbstractTextEditor) targetEditor; + } + } + + public void run(IAction action) { + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (editor == null) { + IEditorPart targetEditor = window.getActivePage().getActiveEditor(); + if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) { + editor = (AbstractTextEditor) targetEditor; + } + } + + if (window != null) { + IWorkbenchPage page = window.getActivePage(); + try { + IViewPart part = page.findView(BrowserView.ID_BROWSER); + if (part == null) { + part = page.showView(BrowserView.ID_BROWSER); + } else { + page.bringToTop(part); + } + Configuration config = getConfiguration(); + String templateString = generateUrl(config, config.getURL()); + if (templateString != null && !templateString.equals("")) { + ((BrowserView) part).setUrl(templateString); + } + } catch (Exception e) { + } + } + } + + public void selectionChanged(IAction action, ISelection selection) { + } + + public IDocument getDocument() { + IDocument doc = editor.getDocumentProvider().getDocument(editor.getEditorInput()); + return doc; + } + + public static String getSelectedText(AbstractTextEditor editor, IDocument document, int initialPos) { + try { + int pos = initialPos; + int line = document.getLineOfOffset(pos); + int start = document.getLineOffset(line); + int end = start + document.getLineInformation(line).getLength(); + + /* + * The line does not include \n or \r so pos can be > end. Making pos = + * end in this case is safe for the purposes of determining the TextRegion + * at the cursor position + */ + if (pos > end) { + pos = end; + } + + int offsetInLine = pos - start; + String word = document.get(start, end - start); + int wordlen = word.length(); + int textStart = -1; + int textEnd = -1; + + for (int i = offsetInLine; i < wordlen; i++) { + if (!Character.isJavaIdentifierPart(word.charAt(i))) { + textEnd = i; + break; + } + } + for (int i = offsetInLine; i >= 0; i--) { + if (!Character.isJavaIdentifierPart(word.charAt(i))) { + textStart = i + 1; + break; + } + } + if (textStart != (-1) && textEnd != (-1) && textStart < textEnd) { + return new String(word.toCharArray(), textStart, textEnd - textStart); + } + } catch (Exception e) { + + } + return null; + } + + public String generateUrl(Configuration config, String template) { + IDocument doc = getDocument(); + ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection(); + int pos = selection.getOffset(); + int len = selection.getLength(); + String wikiTitle; + if (len > 0) { + try { + wikiTitle = doc.get(pos, len); + } catch (BadLocationException e) { + wikiTitle = null; + } + } else { + wikiTitle = getSelectedText(editor, doc, pos); + } + + if (wikiTitle != null && !wikiTitle.equals("")) { + template = template.replaceAll("\\$text.selection", wikiTitle); + wikiTitle = wikiTitle.replaceAll("_", "-"); + template = template.replaceAll("\\$php.selection", wikiTitle); + return template; + } + return null; + } +} \ No newline at end of file