001: /*
002: * MeshCMS - A simple CMS based on SiteMesh
003: * Copyright (C) 2004-2007 Luciano Vernaschi
004: *
005: * This program is free software; you can redistribute it and/or
006: * modify it under the terms of the GNU General Public License
007: * as published by the Free Software Foundation; either version 2
008: * of the License, or (at your option) any later version.
009: *
010: * This program is distributed in the hope that it will be useful,
011: * but WITHOUT ANY WARRANTY; without even the implied warranty of
012: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013: * GNU General Public License for more details.
014: *
015: * You should have received a copy of the GNU General Public License
016: * along with this program; if not, write to the Free Software
017: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
018: *
019: * You can contact the author at http://www.cromoteca.com
020: * and at info@cromoteca.com
021: */
022:
023: package org.meshcms.webui;
024:
025: import java.io.*;
026: import org.meshcms.core.*;
027: import org.meshcms.util.*;
028:
029: /**
030: * Used internally to create the JavaScript code needed by xTree to display
031: * the folder tree. xTree has been created by <a href="http://webfx.eae.net/">WebFX</a>.
032: */
033: public class FolderXTree extends DirectoryParser {
034: WebSite webSite;
035: UserInfo userInfo;
036: Writer writer;
037: String thumbsParam;
038: String rootName;
039:
040: /**
041: * Creates a new instance.
042: *
043: * @param writer used to write down the needed JavaScript code.
044: */
045: public FolderXTree(WebSite webSite, UserInfo userInfo,
046: Writer writer, String thumbsParam, String rootName) {
047: this .webSite = webSite;
048: this .userInfo = userInfo;
049: this .writer = writer;
050: this .thumbsParam = thumbsParam;
051: this .rootName = rootName;
052: setRecursive(true);
053: setSorted(true);
054: setInitialDir(webSite.getRootFile());
055: setDaemon(true);
056: setName("XTree builder");
057: }
058:
059: protected boolean preProcess() {
060: try {
061: writer.write("var folder0 = new WebFXTree('" + rootName
062: + "');\n");
063: writer.write("folder0.setBehavior('explorer');\n");
064: writer.write("folder0.action='showlist.jsp?folder="
065: + thumbsParam + "';\n");
066: writer.write("folder0.target='listframe';\n");
067: //writer.write("folder0.icon='images/world.gif';\n");
068: //writer.write("folder0.openIcon='images/world.gif';\n");
069: } catch (IOException ex) {
070: return false;
071: }
072:
073: return true;
074: }
075:
076: protected void processFile(File file, Path path) {
077: // nothing to do here
078: }
079:
080: protected boolean preProcessDirectory(File file, Path path) {
081: if (path.equals(webSite.getRepositoryPath())) {
082: return false;
083: }
084:
085: boolean include = true;
086:
087: try {
088: DirectoryInfo di = getDirectoryInfo(webSite, userInfo, path);
089:
090: if (di.include) {
091: int code = WebUtils.getMenuCode(path);
092: writer.write("\nvar folder" + code
093: + " = new WebFXTreeItem(\""
094: + path.getLastElement() + "\");\n");
095: writer.write("folder"
096: + WebUtils.getMenuCode(path.getParent())
097: + ".add(folder" + code + ");\n");
098: writer.write("folder" + code
099: + ".action=\"showlist.jsp?folder=" + path
100: + thumbsParam + "\";\n");
101: writer
102: .write("folder" + code
103: + ".target='listframe';\n");
104: if (di.iconName != null) {
105: writer.write("folder" + code + ".icon='images/"
106: + di.iconName + ".png';\n");
107: /* writer.write("folder" + code + ".openIcon='images/" + di.iconName +
108: "open.gif';\n"); */
109: }
110: }
111: } catch (IOException ex) {
112: return false;
113: }
114:
115: return include;
116: }
117:
118: /**
119: * Returns info about a directory, based on path and permissions.
120: */
121: public static DirectoryInfo getDirectoryInfo(WebSite webSite,
122: UserInfo userInfo, Path dirPath) {
123: DirectoryInfo di = new DirectoryInfo();
124:
125: if (dirPath.isContainedIn(webSite.getVirtualSitesPath())) {
126: if (userInfo.canDo(UserInfo.CAN_DO_ADMINTASKS)) {
127: di.include = true;
128:
129: if (dirPath.getElementCount() < webSite
130: .getVirtualSitesPath().getElementCount() + 2) {
131: di.iconName = "folder_star";
132: } else if (webSite instanceof MainWebSite) {
133: Path siteRoot = dirPath
134: .getPartial(webSite.getVirtualSitesPath()
135: .getElementCount() + 1);
136: VirtualWebSite vws = ((MainWebSite) webSite)
137: .getVirtualSite(siteRoot.getLastElement());
138: return getDirectoryInfo(vws, userInfo, dirPath
139: .getRelativeTo(siteRoot));
140: }
141: } else {
142: di.include = false;
143: }
144: } else if (webSite.isSystem(dirPath)) {
145: di.include = false;
146: /* di.iconName = "folder_error";
147: di.include = userInfo.canDo(UserInfo.CAN_DO_ADMINTASKS); */
148: } else if (dirPath.isContainedIn(webSite
149: .getGeneratedFilesPath())) {
150: di.include = false;
151: } else if (dirPath.isContainedIn(webSite.getCMSPath())) {
152: di.iconName = "folder_brick";
153: }
154:
155: return di;
156: }
157:
158: /**
159: * Encapsulates inclusion flag and icon for a directory.
160: */
161: public static class DirectoryInfo {
162: public boolean include = true;
163: public String iconName = null;
164: }
165: }
|