initial contribution
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.wiki / src / net / sourceforge / phpeclipse / wiki / actions / mediawiki / RefreshWikiTextEditorAction.java
diff --git a/archive/net.sourceforge.phpeclipse.wiki/src/net/sourceforge/phpeclipse/wiki/actions/mediawiki/RefreshWikiTextEditorAction.java b/archive/net.sourceforge.phpeclipse.wiki/src/net/sourceforge/phpeclipse/wiki/actions/mediawiki/RefreshWikiTextEditorAction.java
new file mode 100644 (file)
index 0000000..f00d446
--- /dev/null
@@ -0,0 +1,195 @@
+package net.sourceforge.phpeclipse.wiki.actions.mediawiki;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditor;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceStatus;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.dialogs.ListSelectionDialog;
+import org.eclipse.ui.internal.dialogs.ListContentProvider;
+import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+
+public final class RefreshWikiTextEditorAction implements IEditorActionDelegate {
+
+  private IWorkbenchWindow window;
+
+  private AbstractTextEditor fEditor;
+
+  public void dispose() {
+  }
+
+  public void init(IWorkbenchWindow window) {
+    this.window = window;
+  }
+
+  public void selectionChanged(IAction action, ISelection selection) {
+    if (selection.isEmpty()) {
+      return;
+    }
+    if (selection instanceof TextSelection) {
+      action.setEnabled(true);
+      return;
+    }
+    if (window.getActivePage() != null && window.getActivePage().getActivePart() != null) {
+      action.setEnabled(window.getActivePage().getActivePart().getClass().equals(WikiEditor.class));
+    }
+  }
+
+  public void run(IAction action) {
+    if (fEditor == null) {
+      IEditorPart targetEditor = window.getActivePage().getActiveEditor();
+      if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+        fEditor = (AbstractTextEditor) targetEditor;
+      }
+    }
+    if (fEditor != null) {
+      openWikiLinkOnSelection();
+    }
+  }
+
+  public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+    if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+      fEditor = (AbstractTextEditor) targetEditor;
+    }
+  }
+
+  public IDocument getDocument() {
+    IDocument doc = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
+    return doc;
+  }
+
+  public void openWikiLinkOnSelection() {
+    IDocument doc = getDocument();
+    ITextSelection selection = (ITextSelection) fEditor.getSelectionProvider().getSelection();
+    int pos = selection.getOffset();
+    //    String textRegion = getWikiString(fEditor, doc, pos);
+    IFileEditorInput ei = (IFileEditorInput) fEditor.getEditorInput();
+    openWikiFile(ei.getFile());
+  }
+
+  void openWikiFile(IFile cfile) {
+    String wikiName = getWikiFile(cfile);
+    try {
+      if (fEditor != null) {
+        selectWiki(wikiName);
+      }
+    } catch (Exception e) {
+    }
+
+  }
+
+  private void selectWiki(String wikiName) {
+    String exampleWikiURL = "http://en.wikibooks.org/w/wiki.phtml";
+    String selectedWikiURL = null;
+    ArrayList locationsList = new ArrayList();
+    locationsList.add(exampleWikiURL);
+
+    Collections.sort(locationsList);
+
+    ListSelectionDialog listSelectionDialog = new ListSelectionDialog(WikiEditorPlugin.getDefault().getWorkbench()
+        .getActiveWorkbenchWindow().getShell(), locationsList, new ListContentProvider(), new LabelProvider(),
+        "Select the refresh URL.");
+    listSelectionDialog.setTitle("Multiple active configuration found");
+    if (listSelectionDialog.open() == Window.OK) {
+      Object[] locations = listSelectionDialog.getResult();
+      if (locations != null) {
+        for (int i = 0; i < locations.length; i++) {
+          selectedWikiURL = (String) locations[i];
+          break;
+        }
+      }
+    }
+
+    if (selectedWikiURL != null && !selectedWikiURL.equals("")) {
+      String wikiContent = MediaWikiConnector.getWikiText(wikiName, selectedWikiURL);
+      if (wikiContent != null) {
+        IDocument doc = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
+        doc.set(wikiContent);
+      }
+    }
+  }
+
+  private void createNewFileIfNeeded(IFile file, String word) throws CoreException {
+    if (!file.exists()) {
+      createWikiFile(file, word);
+    }
+  }
+
+  private String getWikiFile(IFile file) {
+    return Util.getFileWikiName(file, WikiEditorPlugin.HTML_OUTPUT_PATH);
+    //    IPath path = new Path(wikiFileName);
+    //    return ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
+  }
+
+  /**
+   * Creates a folder resource handle for the folder with the given workspace path. This method does not create the folder resource;
+   * this is the responsibility of <code>createFolder</code>.
+   * 
+   * @param folderPath
+   *          the path of the folder resource to create a handle for
+   * @return the new folder resource handle
+   * @see #createFolder
+   */
+  private IFolder createFolderHandle(IPath folderPath) {
+    return IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getFolder(folderPath);
+  }
+
+  private void createFolder(IFolder folderHandle, IProgressMonitor monitor) throws CoreException {
+    try {
+      // Create the folder resource in the workspace
+      // Recursive to create any folders which do not exist already
+      if (!folderHandle.exists()) {
+        IContainer parent = folderHandle.getParent();
+        if (parent instanceof IFolder && (!((IFolder) parent).exists())) {
+          createFolder((IFolder) parent, monitor);
+        }
+        //                 if (linkTargetPath != null)
+        //                             folderHandle.createLink(linkTargetPath, IResource.ALLOW_MISSING_LOCAL, monitor);
+        //                 else
+        folderHandle.create(false, true, monitor);
+      }
+    } catch (CoreException e) {
+      // If the folder already existed locally, just refresh to get contents
+      if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED)
+        folderHandle.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 500));
+      else
+        throw e;
+    }
+  }
+
+  private void createWikiFile(IFile file, String word) throws CoreException {
+    IContainer parent = file.getParent();
+    if (parent instanceof IFolder && (!((IFolder) parent).exists())) {
+      createFolder((IFolder) parent, null);
+    }
+    String newText = "<!--" + word + "-->";
+    byte[] buffer = newText.getBytes();
+    ByteArrayInputStream source = new ByteArrayInputStream(buffer);
+    file.create(source, true, null);
+  }
+
+}
\ No newline at end of file