blob: 5087f55b16e5e1bde1eba7e7020310cdf5b16524 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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
*******************************************************************************/
package org.eclipse.jdt.internal.ui.javadocexport;
import java.io.File;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.ui.JavaUI;
public class RecentSettingsStore {
private final String HREF= "href"; //$NON-NLS-1$
private final String DESTINATION= "destdir"; //$NON-NLS-1$
private final String ANTPATH= "antpath"; //$NON-NLS-1$
private final String SECTION_PROJECTS= "projects"; //$NON-NLS-1$
private final static char REF_SEPARATOR= ';';
//list of hrefs in string format
private Map fPerProjectSettings;
/**
*
*/
public RecentSettingsStore(IDialogSettings settings) {
fPerProjectSettings= new HashMap();
if (settings != null) {
load(settings);
}
}
/**
* Method creates a list of data structes that contain
* The destination, antfile location and the list of library/project references for every
* project in the workspace.Defaults are created for new project.
*/
private void load(IDialogSettings settings) {
IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
IDialogSettings projectsSection= settings.getSection(SECTION_PROJECTS);
if (projectsSection != null) {
IDialogSettings[] sections= projectsSection.getSections();
for (int i= 0; i < sections.length; i++) {
IDialogSettings curr= sections[i];
String projectName= curr.getName();
IProject project= root.getProject(projectName);
//make sure project has not been removed
if (project.isAccessible()) {
IJavaProject javaProject= JavaCore.create(project);
if (!fPerProjectSettings.containsKey(javaProject)) {
String hrefs= curr.get(HREF);
if (hrefs == null) {
hrefs= ""; //$NON-NLS-1$
}
String destdir= curr.get(DESTINATION);
if (destdir == null || destdir.length() == 0) {
destdir= getDefaultDestination(javaProject);
}
String antpath= curr.get(ANTPATH);
if (antpath == null || antpath.length() == 0) {
antpath= getDefaultAntPath(javaProject);
}
ProjectData data= new ProjectData();
data.setDestination(destdir);
data.setAntpath(antpath);
data.setHRefs(hrefs);
if (!fPerProjectSettings.containsValue(javaProject))
fPerProjectSettings.put(javaProject, data);
}
}
}
}
//finds projects in the workspace that have been added since the
//last time the wizard was run
IProject[] projects= root.getProjects();
for (int i= 0; i < projects.length; i++) {
IProject project= projects[i];
if (project.isAccessible()) {
IJavaProject curr= JavaCore.create(project);
if (!fPerProjectSettings.containsKey(curr)) {
ProjectData data= new ProjectData();
data.setDestination(getDefaultDestination(curr));
data.setAntpath(getDefaultAntPath(curr));
data.setHRefs(""); //$NON-NLS-1$
fPerProjectSettings.put(curr, data);
}
}
}
}
public void store(IDialogSettings settings) {
IDialogSettings projectsSection= settings.addNewSection(SECTION_PROJECTS);
//Write all project information to DialogSettings.
Set keys= fPerProjectSettings.keySet();
for (Iterator iter= keys.iterator(); iter.hasNext();) {
IJavaProject curr= (IJavaProject) iter.next();
IDialogSettings proj= projectsSection.addNewSection(curr.getElementName());
if (!keys.contains(curr)) {
proj.put(HREF, ""); //$NON-NLS-1$
proj.put(DESTINATION, ""); //$NON-NLS-1$
proj.put(ANTPATH, ""); //$NON-NLS-1$
} else {
ProjectData data= (ProjectData) fPerProjectSettings.get(curr);
proj.put(HREF, data.getHRefs());
proj.put(DESTINATION, data.getDestination());
proj.put(ANTPATH, data.getAntPath());
}
projectsSection.addSection(proj);
}
}
public void setProjectSettings(IJavaProject project, String destination, String antpath, String[] hrefs) {
ProjectData data= (ProjectData) fPerProjectSettings.get(project);
if (data == null) {
data= new ProjectData();
}
data.setDestination(destination);
data.setAntpath(antpath);
StringBuffer refs= new StringBuffer();
for (int i= 0; i < hrefs.length; i++) {
if (i > 0) {
refs.append(REF_SEPARATOR);
}
refs.append(hrefs[i]);
}
data.setHRefs(refs.toString());
}
public static String[] getRefTokens(String refs) {
StringTokenizer tok= new StringTokenizer(refs, String.valueOf(REF_SEPARATOR));
String[] res= new String[tok.countTokens()];
for (int i= 0; i < res.length; i++) {
res[i]= tok.nextToken();
}
return res;
}
public String[] getHRefs(IJavaProject project) {
ProjectData data= (ProjectData) fPerProjectSettings.get(project);
if (data != null) {
String refs= data.getHRefs();
return getRefTokens(refs);
}
return new String[0];
}
//for now if multiple projects are selected the destination
//feild will be empty,
public String getDestination(IJavaProject project) {
ProjectData data= (ProjectData) fPerProjectSettings.get(project);
if (data != null)
return data.getDestination();
else
return getDefaultDestination(project);
}
public String getAntpath(IJavaProject project) {
ProjectData data= (ProjectData) fPerProjectSettings.get(project);
if (data != null)
return data.getAntPath();
else
return getDefaultAntPath(project);
}
/// internal
private String getDefaultAntPath(IJavaProject project) {
if (project != null) {
// The Javadoc.xml file can only be stored locally. So if
// the project isn't local then we can't provide a good
// default location.
IPath path= project.getProject().getLocation();
if (path != null)
return path.append("javadoc.xml").toOSString(); //$NON-NLS-1$
}
return ""; //$NON-NLS-1$
}
private String getDefaultDestination(IJavaProject project) {
if (project != null) {
URL url= JavaUI.getProjectJavadocLocation(project);
//uses default if source is has http protocol
if (url == null || !url.getProtocol().equals("file")) { //$NON-NLS-1$
// Since Javadoc.exe is a local tool its output is local.
// So if the project isn't local then the default location
// can't be local to a project. So use #getLocation() to
// test this is fine here.
IPath path= project.getProject().getLocation();
if (path != null)
return path.append("doc").toOSString(); //$NON-NLS-1$
} else {
//must do this to remove leading "/"
return (new File(url.getFile())).getPath();
}
}
return ""; //$NON-NLS-1$
}
private static class ProjectData {
private String fHrefs;
private String fDestinationDir;
private String fAntPath;
public void setHRefs(String hrefs) {
if (hrefs == null)
fHrefs= ""; //$NON-NLS-1$
else
fHrefs= hrefs;
}
public void setDestination(String destination) {
if (destination == null)
fDestinationDir= ""; //$NON-NLS-1$
else
fDestinationDir= destination;
}
public void setAntpath(String antpath) {
if (antpath == null)
fAntPath= ""; //$NON-NLS-1$
else
fAntPath= antpath;
}
public String getHRefs() {
return fHrefs;
}
public String getDestination() {
return fDestinationDir;
}
public String getAntPath() {
return fAntPath;
}
}
}