Added list selection box for file creation from wiki links
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.wiki / src / net / sourceforge / phpeclipse / wiki / actions / CreateFilesFromLinksEditorAction.java
index 5f6739b..32a6ae0 100644 (file)
 package net.sourceforge.phpeclipse.wiki.actions;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
 import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.dialogs.ListSelectionDialog;
+import org.eclipse.ui.internal.dialogs.ListContentProvider;
 
 public final class CreateFilesFromLinksEditorAction extends OpenWikiLinkEditorAction {
 
+  class WikiFile implements Comparable {
+    IFile file;
+
+    String wikiTitle;
+
+    public WikiFile(IFile f, String title) {
+      file = f;
+      wikiTitle = title;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see java.lang.Object#toString()
+     */
+    public String toString() {
+      return wikiTitle + " - " + file.getProjectRelativePath().toString();
+    }
+    /* (non-Javadoc)
+     * @see java.lang.Comparable#compareTo(java.lang.Object)
+     */
+    public int compareTo(Object o) {
+      return wikiTitle.compareTo(((WikiFile)o).wikiTitle);
+    }
+  }
+
   public void openWikiLinkOnSelection() {
     IDocument doc = getDocument();
-    //    ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
-    //    int pos = selection.getOffset();
+    ArrayList startPositionList = getLinksStartingPosition(doc);
+
+    HashSet wikiNames = new HashSet();
+    ArrayList filesList = new ArrayList();
+    ArrayList wikiList = new ArrayList();
+    String wikiTitle;
+    Integer posInteger;
+    IFile currentFile = ((IFileEditorInput) editor.getEditorInput()).getFile();
+
+    for (int i = 0; i < startPositionList.size(); i++) {
+      posInteger = (Integer) startPositionList.get(i);
+      wikiTitle = getWikiTitle(editor, doc, posInteger.intValue());
+
+      if (wikiTitle != null && !wikiTitle.equals("")) {
+        if (!wikiNames.contains(wikiTitle)) {
+          IFile file = getWikiFile(currentFile, wikiTitle);
+          filesList.add(new WikiFile(file, wikiTitle));
+//          wikiList.add(wikiTitle);
+          wikiNames.add(wikiTitle);
+        }
+      }
+    }
+
+    if (filesList.size() > 0) {
+      Collections.sort(filesList);
+      ListSelectionDialog listSelectionDialog = new ListSelectionDialog(WikiEditorPlugin.getDefault().getWorkbench()
+          .getActiveWorkbenchWindow().getShell(), filesList, new ListContentProvider(), new LabelProvider(),
+          "Select the links for file creation:");
+      listSelectionDialog.setTitle("Links found in this article");
+      if (listSelectionDialog.open() == Window.OK) {
+        Object[] locations = listSelectionDialog.getResult();
+        if (locations.length > 0) {
+          IFile[] files = new IFile[locations.length];
+          String[] wikiTitles = new String[locations.length];
+          for (int i = 0; i < files.length; i++) {
+            files[i] = ((WikiFile) locations[i]).file;
+            wikiTitles[i] = ((WikiFile) locations[i]).wikiTitle;
+          }
+          
+          Job job = new CreateFilesJob(files, wikiTitles);
+          //        job.setRule(createRule(files));
+          job.setRule(null);
+          job.setUser(true);
+          job.schedule();
+        }
+      }
+
+    }
+  }
+
+  /**
+   * @param doc
+   * @return
+   */
+  private ArrayList getLinksStartingPosition(IDocument doc) {
     ArrayList startPositionList = new ArrayList();
     char[] text = doc.get().toCharArray();
-    try { 
+    try {
       char ch = ' ';
       int i = 0;
       int startPos = -1;
@@ -33,6 +119,7 @@ public final class CreateFilesFromLinksEditorAction extends OpenWikiLinkEditorAc
           ch = text[i++];
           if (ch == ']' && startPos != (-1)) {
             startPositionList.add(new Integer(startPos));
+            startPos = -1;
           }
           break;
         case '\r':
@@ -44,52 +131,6 @@ public final class CreateFilesFromLinksEditorAction extends OpenWikiLinkEditorAc
     } catch (IndexOutOfBoundsException e) {
       // ignore it
     }
-    HashSet wikiNames = new HashSet();
-    ArrayList filesList = new ArrayList();
-    ArrayList wikiList = new ArrayList();
-    String wikiTitle;
-    Integer posInteger;
-    IFile currentFile = ((IFileEditorInput) editor.getEditorInput()).getFile();
-    for (int i = 0; i < startPositionList.size(); i++) {
-      posInteger = (Integer) startPositionList.get(i);
-      wikiTitle = getWikiTitle(editor, doc, posInteger.intValue());
-      
-      if (wikiTitle != null && !wikiTitle.equals("")) {
-        if (!wikiNames.contains(wikiTitle)) {
-          IFile file = getWikiFile(currentFile, wikiTitle);
-          filesList.add(file);
-          wikiList.add(wikiTitle);
-          wikiNames.add(wikiTitle);
-        }
-      } 
-    }
-    
-    if (filesList.size() > 0) {
-      IFile[] files = new IFile[filesList.size()];
-      String[] wikiTitles = new String[filesList.size()];
-      filesList.toArray(files);
-      wikiList.toArray(wikiTitles);
-      Job job = new CreateFilesJob(files, wikiTitles);
-      //        job.setRule(createRule(files));
-      job.setRule(null);
-      job.setUser(true);
-      job.schedule();
-    }
-//
-//    
-//    Iterator iter = wikiNames.iterator();
-//    while (iter.hasNext()) {
-//      openWikiFile(file, (String) iter.next(), false);
-//    }
+    return startPositionList;
   }
-
-//  public void openWikiFile(IFile cfile, String word, boolean openEditor) {
-//    if (word != null && !word.equals("")) {
-//      IFile file = getWikiFile(cfile, word);
-//      try {
-//        createNewFileIfNeeded(file, word);
-//      } catch (Exception e) {
-//      }
-//    } 
-//  }
 }
\ No newline at end of file