Upload/Download of multiple files now possible
[phpeclipse.git] / archive / net.sourceforge.phpeclipse.wiki / src / net / sourceforge / phpeclipse / wiki / actions / mediawiki / RefreshWikiFilesAction.java
1 package net.sourceforge.phpeclipse.wiki.actions.mediawiki;
2
3 import java.lang.reflect.InvocationTargetException;
4 import java.util.ArrayList;
5 import java.util.Collections;
6 import java.util.HashSet;
7 import java.util.Iterator;
8 import java.util.List;
9
10 import net.sourceforge.phpeclipse.wiki.actions.mediawiki.config.IWikipedia;
11 import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
12 import net.sourceforge.phpeclipse.wiki.internal.Configuration;
13 import net.sourceforge.phpeclipse.wiki.internal.ConfigurationManager;
14 import net.sourceforge.phpeclipse.wiki.internal.IConfiguration;
15
16 import org.eclipse.core.resources.IFile;
17 import org.eclipse.core.resources.IResource;
18 import org.eclipse.core.resources.IResourceRuleFactory;
19 import org.eclipse.core.resources.IResourceVisitor;
20 import org.eclipse.core.resources.ResourcesPlugin;
21 import org.eclipse.core.runtime.CoreException;
22 import org.eclipse.core.runtime.jobs.ISchedulingRule;
23 import org.eclipse.core.runtime.jobs.Job;
24 import org.eclipse.core.runtime.jobs.MultiRule;
25 import org.eclipse.jface.action.IAction;
26 import org.eclipse.jface.viewers.ISelection;
27 import org.eclipse.jface.viewers.ISelectionProvider;
28 import org.eclipse.jface.viewers.LabelProvider;
29 import org.eclipse.jface.viewers.StructuredSelection;
30 import org.eclipse.jface.window.Window;
31 import org.eclipse.ui.IActionDelegate;
32 import org.eclipse.ui.IObjectActionDelegate;
33 import org.eclipse.ui.IWorkbenchPart;
34 import org.eclipse.ui.dialogs.ListSelectionDialog;
35 import org.eclipse.ui.internal.dialogs.ListContentProvider;
36
37 public class RefreshWikiFilesAction implements IObjectActionDelegate {
38   private IWorkbenchPart workbenchPart;
39
40   protected Configuration getConfigurationPrefix(String prefix) {
41     List allConfigsList = ConfigurationManager.getInstance().getConfigurations();
42     ArrayList configsList = new ArrayList();
43     for (int i = 0; i < allConfigsList.size(); i++) {
44       IConfiguration temp = (IConfiguration) allConfigsList.get(i);
45       if (temp.getType().startsWith(prefix)) {
46         configsList.add(temp);
47       }
48     }
49     if (configsList.size() == 1) {
50       return (Configuration) configsList.get(0);
51     }
52     Collections.sort(configsList);
53     Configuration configuration = null;
54     ListSelectionDialog listSelectionDialog = new ListSelectionDialog(WikiEditorPlugin.getDefault().getWorkbench()
55         .getActiveWorkbenchWindow().getShell(), configsList, new ListContentProvider(), new LabelProvider(),
56         "Select the refresh URL.");
57     listSelectionDialog.setTitle("Multiple active configuration found");
58     if (listSelectionDialog.open() == Window.OK) {
59       Object[] locations = listSelectionDialog.getResult();
60       if (locations != null) {
61         for (int i = 0; i < locations.length; i++) {
62           configuration = (Configuration) locations[i];
63           break;
64         }
65       }
66     }
67     return configuration;
68   }
69
70   protected Configuration getConfiguration() {
71     return getConfigurationPrefix(WikiEditorPlugin.PREFIX_LOAD);
72   }
73
74   /**
75    *  
76    */
77   public RefreshWikiFilesAction() {
78     super();
79   }
80
81   /**
82    * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
83    */
84   public void setActivePart(IAction action, IWorkbenchPart targetPart) {
85     workbenchPart = targetPart;
86   }
87
88   public void run(IAction action) {
89     try {
90       ISelectionProvider selectionProvider = null;
91       selectionProvider = workbenchPart.getSite().getSelectionProvider();
92
93       StructuredSelection selection = null;
94       selection = (StructuredSelection) selectionProvider.getSelection();
95
96       //Shell shell = null;
97       Iterator iterator = null;
98       iterator = selection.iterator();
99       Configuration configuration = getConfiguration();
100       String wikiLocale = configuration.getType().substring(WikiEditorPlugin.PREFIX_LOAD.length());
101       IWikipedia wikipediaProperties = WikiEditorPlugin.getWikiInstance(wikiLocale);
102       
103       final HashSet set = new HashSet();
104       IResourceVisitor visitor = new IResourceVisitor() {
105         public boolean visit(IResource resource) {
106           switch (resource.getType()) {
107           case IResource.FILE:
108             if (resource.getFileExtension().equalsIgnoreCase(WikiEditorPlugin.WP_EXTENSION)) {
109               set.add(resource);
110             }
111             break;
112           }
113           return true;
114         }
115       };
116       
117       while (iterator.hasNext()) {
118         //  obj => selected object in the view
119         Object obj = iterator.next();
120
121         // is it a resource
122         if (obj instanceof IResource) {
123           IResource resource = (IResource) obj;
124           // check if it's a file resource
125           switch (resource.getType()) {
126           case IResource.FOLDER:
127           case IResource.FILE:
128             resource.accept(visitor);
129             break;
130           }
131         }
132       }
133       if (set.size() > 0) {
134         IFile[] files = new IFile[set.size()];
135         set.toArray(files);
136
137         Job job = new RefreshJob(wikipediaProperties, files, configuration.getURL());
138         //        job.setRule(modifyRule(files));
139         job.setRule(null);
140         job.setUser(true);
141         job.schedule();
142       }
143     } catch (CoreException e) {
144       // TODO Auto-generated catch block
145       e.printStackTrace();
146     } catch (NoSuchMethodException e) {
147       // TODO Auto-generated catch block
148       e.printStackTrace();
149     } catch (IllegalAccessException e) {
150       // TODO Auto-generated catch block
151       e.printStackTrace();
152     } catch (ClassNotFoundException e) {
153       // TODO Auto-generated catch block
154       e.printStackTrace();
155     } catch (InvocationTargetException e) {
156       // TODO Auto-generated catch block
157       e.printStackTrace();
158     }
159   }
160
161   public ISchedulingRule modifyRule(IFile[] files) {
162     ISchedulingRule combinedRule = null;
163     IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
164     ISchedulingRule rule;
165     for (int i = 0; i < files.length; i++) {
166       rule = ruleFactory.modifyRule(files[i]);
167       combinedRule = MultiRule.combine(rule, combinedRule);
168     }
169     return combinedRule;
170   }
171
172   /**
173    * @see IActionDelegate#selectionChanged(IAction, ISelection)
174    */
175   public void selectionChanged(IAction action, ISelection selection) {
176   }
177
178 }