/plugins/ProjectViewer/tags/pv_2_1_0_1/docs/users-guide.xml

# · XML · 780 lines · 690 code · 88 blank · 2 comment · 0 complexity · c8b3b032b8771d67c709c43814de9c35 MD5 · raw file

  1. <?xml version="1.0"?>
  2. <!-- ProjectViewer plugin user's guide -->
  3. <!-- (C) 2001,2002,2003 Marcelo Vanzin, Stefan Kost -->
  4. <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "docbookx.dtd">
  5. <book>
  6. <bookinfo>
  7. <title>ProjectViewer plugin</title>
  8. <authorgroup>
  9. <author><firstname>Dale</firstname><surname>Anson</surname></author>
  10. <author><firstname>Kevin</firstname><surname>Burton</surname></author>
  11. <author><firstname>Stefan</firstname><surname>Kost</surname></author>
  12. <author><firstname>Matthew</firstname><surname>Payne</surname></author>
  13. <author><firstname>Marcelo</firstname><surname>Vanzin</surname></author>
  14. <author><firstname>Calvin</firstname><surname>Yu</surname></author>
  15. </authorgroup>
  16. <legalnotice>
  17. <title>Legal Notice</title>
  18. <para>
  19. Permission is granted to copy, distribute and/or modify
  20. this document under the terms of the GNU Free
  21. Documentation License, Version 1.1 or any later version
  22. published by the Free Software Foundation; with no
  23. <quote>Invariant Sections</quote>,
  24. <quote>Front-Cover Texts</quote> or
  25. <quote>Back-Cover Texts</quote>,
  26. each as defined in the license.
  27. A copy of the license can be found in the file
  28. <filename>COPYING.DOC.txt</filename> included with jEdit.
  29. </para>
  30. </legalnotice>
  31. </bookinfo>
  32. <chapter id="presentation">
  33. <title>Presentation</title>
  34. <para>
  35. The ProjectViewer plugin allows to define groups of files as
  36. projects.
  37. </para>
  38. <bridgehead renderas='sect3'>What is a project?</bridgehead>
  39. <para>
  40. A project is a group of files. It has a name, a root
  41. directory, and an optional URL Root, along with other
  42. options that can be made available by other plugins.
  43. </para>
  44. <para>
  45. In this version of Project Viewer, the files in a project
  46. are not restricted to the project root: any file can be
  47. added to the project (or to any directory in the project),
  48. allowing you to organize your files however you find most
  49. convenient, independently of the file system layout. The
  50. project root and the files and directories below it have a
  51. special treatment not given to others, though.
  52. </para>
  53. <para>
  54. If a project is intented for website development, setting
  55. the URL Root will enable project files to be launched in a
  56. web browser. Suppose the project "Root" also correlates to
  57. the URL "http://localhost/myproject/" currently running on a
  58. web server, launching the file "hello.jsp" will launch the
  59. web browser with the URL
  60. "http://localhost/myproject/hello.jsp", if the file is
  61. directly under the root.
  62. </para>
  63. <para>
  64. To create a project, click the "Add/Edit Project" button in
  65. the toolbar, or choose "Add new project" from under the
  66. desired group in the projects menu (accessible from jEdit's
  67. plugin menu of from the ProjectViewer toolbar).
  68. </para>
  69. </chapter>
  70. <chapter id="usage">
  71. <title>Using the ProjectViewer plugin</title>
  72. <para>
  73. The plugin interface consists of a tool bar, containing some
  74. command buttons, a menu containing the currently
  75. available projects (accessible through the button labeled
  76. with the current active node), and the project's views.
  77. </para>
  78. <para>
  79. To open a ProjectViewer window, you'll need to choose the
  80. "Open Project Viewer" action from the plugin's menu.
  81. Optionally, you can go to the Global Options dialog in
  82. jEdit, and dock the window in your favorite position (in the
  83. "Docking" tab). Note that activating a project or group
  84. using the plugin menu will not open a ProjectViewer window
  85. if one is not already opened.
  86. </para>
  87. <bridgehead renderas='sect3'>Organizing Your Projects</bridgehead>
  88. <para>
  89. Project Viewer allows you to organize your projects into
  90. groups. You can create as many groups as you with in an
  91. hierarchical manner, by using the "Add group here" command
  92. in the tree's context menu, or choosing the "New group here"
  93. entry from under the desired group in the projects menu.
  94. </para>
  95. <para>
  96. As with projects, it is possible to have groups as the root
  97. of the tree shown in the dockable window. For this, just
  98. choose a group from the projects menu to make it active.
  99. Some plugin functionality is not available when in this
  100. mode.
  101. </para>
  102. <para>
  103. You can also move projects and groups to other locations in
  104. your group hierarchy by using the "Move to..." command in
  105. the tree's context menu and choosing the desired destination
  106. from the displayed menu.
  107. </para>
  108. <bridgehead renderas='sect3'>The Project Views</bridgehead>
  109. <para>
  110. There are four possible views of the files on a project: the
  111. "Folders" view, which shows the files as if in a file
  112. manager, organised in directories. The "Files" view, which
  113. shows all the project's files in a flat list. The "Working
  114. Files", which shows the files currently opened in jEdit. And
  115. the "Compact View", which compresses subdirectories into
  116. top-level nodes, showing a structure similar to the java
  117. package naming.
  118. </para>
  119. <para>
  120. The files in the different views are colored according to
  121. the patterns and colors you have choosen for the
  122. filesystem-browser. Furthermore currently open files are
  123. highlighted by underlining their names.
  124. </para>
  125. <para>
  126. You can interact with the project tree in several ways:
  127. </para>
  128. <itemizedlist>
  129. <listitem>
  130. <para>
  131. Double clicking on a file will cause it to be opened in
  132. a jEdit buffer. If the file is already open, then
  133. ProjectViewer follows the FileSystemBrowser
  134. configuration option to decide whether to close it or
  135. not.
  136. </para>
  137. </listitem>
  138. <listitem>
  139. <para>
  140. Middle-clicking on a file does the same as
  141. double-clicking, except it will always close open files.
  142. </para>
  143. </listitem>
  144. <listitem>
  145. <para>
  146. The right mouse button shows a context menu with options
  147. related to the current selection on the tree, allowing
  148. you to remove files or directories from a project,
  149. deleting them from the disk, or rename them, among many
  150. other options.
  151. </para>
  152. </listitem>
  153. <listitem>
  154. <para>
  155. Dragging a file from the trees and dropping it on
  156. jEdit's text area will cause the file to be opened.
  157. </para>
  158. </listitem>
  159. </itemizedlist>
  160. <bridgehead renderas='sect3'>Importing Files</bridgehead>
  161. <para>
  162. Differently from earlier releases, the plugin does not
  163. follow the filesystem layout to organize files anymore,
  164. except for certain cases; notably, when doing the initial
  165. import from the project root or when adding a file that has
  166. been saved from an open buffer and is not currently part of
  167. the project.
  168. </para>
  169. <para>
  170. In the import dialog (available by choosing "Import files"
  171. from the right-click menu), you can choose any files to be
  172. imported to the selected node (the one where you clicked to
  173. get the context menu). The same filters available when doing
  174. the initial import for the project are available in the file
  175. chooser.
  176. </para>
  177. <para>
  178. You may choose any files and directories to import, even
  179. files and directories that are not "children" of the
  180. selected node in the file system layout. This allows you to
  181. organize your files in any way you want. You may even enter
  182. the name of a non-existant file in the file chooser: it will
  183. be treated as a directory, and even though the directory
  184. does not exist on disk, you'll have the same functionality
  185. for it as you have for other directories in your project.
  186. </para>
  187. <para>
  188. When importing existing directories, you'll be asked if you
  189. want to import them recursively. Again, the three options
  190. for file filtering are presented, so you can have more
  191. control over which files are imported. The dialog will
  192. appear once for each import, and not for each directory in
  193. that particular import process.
  194. </para>
  195. <para>
  196. The importing process can be customized to import only the
  197. files you find important for your project. When browsing
  198. files or importing directories, you may choose any of the
  199. given file filter to filter out unwanted files. File filters
  200. include: Non-project files (default on importing, used for
  201. the "import all files" option), Import settings (see
  202. "Customization", below) and CVS/Entries (only list files
  203. listed in the CVS/Entries file of the current directory).
  204. </para>
  205. <bridgehead renderas='sect3'>Commands available in the toolbar</bridgehead>
  206. <para>
  207. The tool bar provides a fast way to access some of the
  208. functionality of the Project Viewer plugin. The available
  209. commands are:
  210. </para>
  211. <itemizedlist>
  212. <listitem>
  213. <para>
  214. Add/Edit project: shows the project properties
  215. dialog, where you can enter information about a new
  216. project. If the "All Projects" view is used, and no
  217. node (or the root) is selected, the "Create Project"
  218. dialog apperas, instead of the current project's
  219. properties.
  220. </para>
  221. </listitem>
  222. <listitem>
  223. <para>
  224. Expand the file list: opens all nodes in the
  225. currently selected tree.
  226. </para>
  227. </listitem>
  228. <listitem>
  229. <para>
  230. Contract the file list: closes all nodes in the
  231. current tree.
  232. </para>
  233. </listitem>
  234. <listitem>
  235. <para>
  236. Add file to project root: shows a dialog where you
  237. can choose single files to add to the current
  238. project. Differently from the "Add files" in the
  239. context menu, this option will work as in the old
  240. Project Viewer versions, only importing files below
  241. the project root, and keeping the file system layout
  242. for files and directories.
  243. </para>
  244. </listitem>
  245. </itemizedlist>
  246. <bridgehead renderas='sect3'>Commands available in the context menu</bridgehead>
  247. <para>
  248. The context menu provides context-sensitive options based on
  249. the current tree selection. The following commands can be
  250. found in the context menu (some of them have already been
  251. explained above):
  252. </para>
  253. <itemizedlist>
  254. <listitem>
  255. <para>
  256. Add files: pops a file chooser from where you can
  257. choose any files or directories to import. These
  258. will be imported <emphasis>into the selected
  259. node</emphasis>, disregarding the file system
  260. layout. If importing directories, you'll be prompted
  261. if you want to do it recursively using one of the
  262. available filters.
  263. </para>
  264. </listitem>
  265. <listitem>
  266. <para>
  267. Add files from VFS: lets you select files from a
  268. jEdit VFS (Virtual File System), such as FTP. If you
  269. choose local files, ProjectViewer will add standard
  270. files instead of VFS files. The functionality of VFS
  271. files in ProjectViewer is rather limited when
  272. compared to standard files.
  273. </para>
  274. </listitem>
  275. <listitem>
  276. <para>
  277. Re-import files: this command will remove all files
  278. and directories below the project root, and re-read
  279. the file structure from disk according to the
  280. selected filter (which can be chosen from the dialog
  281. that pops up). It will also analyze directories not
  282. under the project root: it will re-import existing
  283. directories and remove stale files from "virtual"
  284. directories.
  285. </para>
  286. </listitem>
  287. <listitem>
  288. <para>
  289. Remove from project: this will remove the selected
  290. node from the project to which it belongs. It is
  291. also possible to remove multiple nodes at once.
  292. </para>
  293. </listitem>
  294. <listitem>
  295. <para>
  296. Delete from disk: this is only shown for files to
  297. which you have write permission. Choosing it will
  298. cause the files to be deleted from disk and removed
  299. from the project.
  300. </para>
  301. </listitem>
  302. <listitem>
  303. <para>
  304. Rename: this will prompt you for a new name for the
  305. selected node. If you check the "Don't change name
  306. on disk" option, only the node name on the tree will
  307. be changed; the file on disk will keep its current
  308. name.
  309. </para>
  310. </listitem>
  311. <listitem>
  312. <para>
  313. Archive project: this will prompt you for a file
  314. name. A JAR archive will be created containing all
  315. files below the project root.
  316. </para>
  317. </listitem>
  318. <listitem>
  319. <para>
  320. Preview in browser: this will open the file in the
  321. configured web browser. If a project URL is set,
  322. files below the project root will be redirected to
  323. the given URL; in other cases, the "file://"
  324. protocol will be used. The part of the file path
  325. corresponding to the project root will be removed
  326. when opening the file relatively to the project URL.
  327. </para>
  328. </listitem>
  329. <listitem>
  330. <para>
  331. Open with: this will open the selected file in a
  332. configured application associated with its extension
  333. (configured in the Project Viewer's plugin options).
  334. If no application is configured for the selected
  335. file, selecting this option will prompt you to
  336. choose an application.
  337. </para>
  338. </listitem>
  339. </itemizedlist>
  340. <bridgehead renderas='sect3'>Using PV commands from jEdit</bridgehead>
  341. <para>
  342. Some commands are also available as jEdit actions so that
  343. shortcuts can be assigned to them. You can check all the
  344. possible commands available as actions by going to the
  345. "Shortcuts" panel in the jEdit options dialog, and selecting
  346. the ProjectViewer plugin.
  347. </para>
  348. <para>
  349. When executing a command using a shortcut, you may notice
  350. that sometimes no action is performed and an error message
  351. appears in the status bar. This means that the action is not
  352. available for the current selection in the tree. To check
  353. which actions are available for the selected node(s), check
  354. the context menu by clicking the node with the right mouse
  355. button.
  356. </para>
  357. <bridgehead renderas='sect3'>Third party plugins commands</bridgehead>
  358. <para>
  359. Project Viewer can be extended by other plugins; they can
  360. add properties to a project and define new actions for nodes
  361. in the tree. Consult each plugins documentation for
  362. information about possible commands available for the
  363. Project Viewer plugin.
  364. </para>
  365. <para>
  366. For developers go to chapter <link linkend="developer"
  367. endterm="developer.title"/> to get some starting help fo how to
  368. cooperate with the Project Viewer plugin.
  369. </para>
  370. </chapter>
  371. <chapter id="customization">
  372. <title>Customization</title>
  373. <para>
  374. Several options are configurable from the jEdit options
  375. dialog. There are options to control the GUI of the plugin,
  376. and internal behaviour when executing several actions. The
  377. options are:
  378. </para>
  379. <bridgehead renderas='sect3'>General Behaviour Options</bridgehead>
  380. <itemizedlist>
  381. <listitem>
  382. <para>
  383. Use external applications by default: if selected,
  384. files that are open from the tree (by either
  385. double-clicking or middle-clicking) will be opened
  386. using the external application configured for the
  387. file's extension, if any. If no application is
  388. found, it will be opened in jEdit. You can still
  389. open the file in jEdit by dragging the file node
  390. onto jEdit's text area. When opening in an external
  391. application, you'll lose support for auto-closing
  392. the file on project file, auto-loading the file when
  393. the project is re-activated and the file node won't
  394. be underlined, indicating it is opened..
  395. </para>
  396. </listitem>
  397. <listitem>
  398. <para>
  399. Close files on project change: if selected, files
  400. from the current project that are opened in jEdit
  401. will be closed when you switch to another project.
  402. </para>
  403. </listitem>
  404. <listitem>
  405. <para>
  406. Remember open files: if selected, files opened in
  407. the current project will be re-opened when you
  408. select the same project in a later moment, even
  409. between different jEdit sessions.
  410. </para>
  411. </listitem>
  412. <listitem>
  413. <para>
  414. Delete non-existant files from list: if selected,
  415. each file in the project is verified to exist when
  416. the project loads. If the file does not exist, it is
  417. removed from the project.
  418. </para>
  419. </listitem>
  420. <listitem>
  421. <para>
  422. Ask to import new files: if "Always" is selected,
  423. every time you save a file located below the active
  424. project's root, and the file is not yet part of the
  425. project, you'll be asked whether you want to import
  426. it. Selecting "Once per session" will ask only one
  427. time during the time the current project stays
  428. active. "Never" will disable this feature. "Auto
  429. import" will automatically add to the project any
  430. saved files which are under the project root and are
  431. not currently part of the project.
  432. </para>
  433. </listitem>
  434. </itemizedlist>
  435. <bridgehead renderas='sect3'>GUI Options</bridgehead>
  436. <itemizedlist>
  437. <listitem>
  438. <para>
  439. Show toolbar: whether to show the plugin's toolbar
  440. or not. The toolbar is automatically hidden when no
  441. tree is selected for showing, regardless of this
  442. option.
  443. </para>
  444. </listitem>
  445. <listitem>
  446. <para>
  447. Show folders tree: if the "Folders" tree view should
  448. be shown.
  449. </para>
  450. </listitem>
  451. <listitem>
  452. <para>
  453. Show files tree: if the "Files" tree view should be
  454. shown. Disabling this view can greatly improve
  455. performance when your projects have many files.
  456. </para>
  457. </listitem>
  458. <listitem>
  459. <para>
  460. Show working files tree: if the "Working Files" tree
  461. view should be shown.
  462. </para>
  463. </listitem>
  464. <listitem>
  465. <para>
  466. Show compact tree: whether the "Compact" tree view
  467. should be shown.
  468. </para>
  469. </listitem>
  470. <listitem>
  471. <para>
  472. Use system icons for files: instead of using jEdit's
  473. icons, uses the system provided icon for each
  474. individual files. The jEdit icon will still be used
  475. when the file is opened. In some systems, the system
  476. icons may not be accessible from Java, so this
  477. option may not work as expected. Also, this option
  478. is only available if Java 2 version 1.4 or later is
  479. being used.
  480. </para>
  481. </listitem>
  482. </itemizedlist>
  483. <bridgehead renderas='sect3'>Import Options</bridgehead>
  484. <para>
  485. This controls the behaviour of the "Import settings" filter
  486. available when importing files.
  487. </para>
  488. <itemizedlist>
  489. <listitem>
  490. <para>
  491. Files to include: a list of globs that match files
  492. you want to include in a project (e.g., "*.html",
  493. "*.java", "README*"). If you want to exclude files
  494. from the automatic import, prepend the glob with the
  495. "!" character (e.g., "!*.class").
  496. </para>
  497. </listitem>
  498. <listitem>
  499. <para>
  500. Directories to ignore: space-separated list of globs
  501. to match directory names to ignore when doing
  502. automatic import of files. No files within
  503. directories whose names are listed here will be
  504. imported.
  505. </para>
  506. </listitem>
  507. </itemizedlist>
  508. <bridgehead renderas='sect3'>Web Project Options</bridgehead>
  509. <itemizedlist>
  510. <listitem>
  511. <para>
  512. Use InfoViewer's browser settings: if you have the
  513. InfoViewer plugin installed, you can choose to check
  514. this box, and when asking to open a file in a web
  515. browser, InfoViewer is going to be used to launch
  516. you browser of choice.
  517. </para>
  518. </listitem>
  519. <listitem>
  520. <para>
  521. Browser path: the path to the web browser to be used
  522. for viewing selected files, with any needed
  523. command-line switches, in case you don't want to use
  524. the same settings as the InfoViewer plugin.
  525. </para>
  526. </listitem>
  527. </itemizedlist>
  528. <bridgehead renderas='sect3'>Editing the context menu</bridgehead>
  529. <para>
  530. ProjectViewer provides an interface similar to jEdit's
  531. context menu editor, where you can add actions to be
  532. displayed in the trees' context menus. You can't remove the
  533. default entries in the context menu, but any action
  534. available to jEdit can be added. It's important to notice
  535. that adding an action to the context menu won't make it
  536. "Project Viewer aware": unless the action is specifically
  537. written to interface with ProjectViewer, it will work the
  538. same way as it would if executed from any other place (such
  539. as the jEdit toolbar or menu).
  540. </para>
  541. <bridgehead renderas='sect3'>File Associations</bridgehead>
  542. <para>
  543. The "External Applications" option pane can be used to
  544. register applications you want to use for specific file
  545. type, accessible through the "Open with..." context menu
  546. command for files. Just add a file name glob and choose the
  547. application you wish to use for that entry.
  548. </para>
  549. </chapter>
  550. <chapter id="developer">
  551. <title id="developer.title">Developer Documentation</title>
  552. <para>
  553. At first, there's a comprehensive documentation included
  554. with the source distribution in Javadoc format. Just
  555. download the source from the jEdit CVS and create the
  556. documentation by executing the "javadoc" Ant task in the
  557. Project Viewer directory. Documentation will be created
  558. under the directory "build/docs/javadoc".
  559. </para>
  560. <para>
  561. External plugins can interact with the Project Viewer plugin in
  562. various ways:
  563. <itemizedlist>
  564. <listitem><para>By providing project specific properties: properties</para></listitem>
  565. <listitem><para>By creating new node types: nodes</para></listitem>
  566. <listitem><para>By creating node-specific actions: actions</para></listitem>
  567. <listitem><para>By listening to Project Viewer events</para></listitem>
  568. </itemizedlist>
  569. </para>
  570. <para>
  571. During the next sub chapters we will describe some common task
  572. for interacting with projectviewer.
  573. </para>
  574. <section id="developer-checkpv">
  575. <title id="developer-checkpv.title">Checking if projectviewer is available</title>
  576. The method described here requires a jEdit with version > 4.2preX.
  577. <informalexample>
  578. <programlisting>
  579. EditPlugin pv;
  580. pv=jEdit.getPlugin("projectviewer.ProjectPlugin",false);
  581. if(pv!=null) {
  582. // we can use the projectviewer plugin
  583. }
  584. </programlisting>
  585. </informalexample>
  586. </section>
  587. <section id="developer-prjfile">
  588. <title id="developer-prjfile.title">Getting the project the a given file belongs to</title>
  589. <informalexample>
  590. <programlisting>
  591. ProjectManager pm=getInstance()
  592. // then use java.util.Iterator getProjects();
  593. // and foreach project use VPTNode node=prj.getChildNode(java.lang.String path);
  594. </programlisting>
  595. </informalexample>
  596. </section>
  597. <section id="developer-prjview">
  598. <title id="developer-prjview.title">Getting the project of the given view</title>
  599. <informalexample>
  600. <programlisting>
  601. VPTProject prj=ProjectViewer.getActiveProject(org.gjt.sp.jedit.View aView);
  602. ProjectViewer pv=ProjectViewer.getViewer(org.gjt.sp.jedit.View view);
  603. </programlisting>
  604. </informalexample>
  605. </section>
  606. </chapter>
  607. <chapter id="troubleshooting">
  608. <title>Troubleshooting</title>
  609. <bridgehead renderas='sect3'>Canonical File Paths</bridgehead>
  610. <para>
  611. The JRE, up to version 1.4 (at least), has a bug in
  612. JFileChooser when using the Metal Look &amp; Feel. It will
  613. resolve canonical paths when changing directories. While
  614. ProjectViewer tries to work around this issue, it may lead
  615. to some strange behaviors, especially when importing files.
  616. </para>
  617. <bridgehead renderas='sect3'>Large projects</bridgehead>
  618. <para>
  619. Large projects can take some time to load, especially over a
  620. network connection. This is due to the fact that Project
  621. Viewer resolves all canonical paths so that it can better
  622. interact with jEdit. If your project has lots of files
  623. ("lots" meaning over one or two thousand), you may
  624. experience some delays when loading it. jEdit is not blocked
  625. while the project is loading, though, so you can continue
  626. your work.
  627. </para>
  628. <bridgehead renderas='sect3'>Multiple Viewer in same jEdit View</bridgehead>
  629. <para>
  630. jEdit allows multiple instances of the same dockable for the
  631. same view. Project Viewer does not support this feature and
  632. will issue an error message if you try to open two Project
  633. Viewer windows in the same view.
  634. </para>
  635. </chapter>
  636. <chapter id="license">
  637. <title>License</title>
  638. <para>
  639. The source code is distributed under the GPL.
  640. Please see
  641. <ulink url="http://www.fsf.org/copyleft/gpl.html">
  642. http://www.fsf.org/copyleft/gpl.html
  643. </ulink>
  644. </para>
  645. </chapter>
  646. <chapter id="feedback">
  647. <title>Feedback</title>
  648. <para>
  649. The preferred way to send bug reports is to use the
  650. Sourceforge Bug Tracker at
  651. <ulink url="http://sourceforge.net/tracker/?atid=565475&amp;group_id=588">
  652. http://sourceforge.net/tracker/?atid=565475&amp;group_id=588
  653. </ulink>
  654. Please start the report subject with the text "ProjectViewer:".
  655. </para>
  656. <para>You can also write to:</para>
  657. <itemizedlist>
  658. <listitem>
  659. <para>
  660. Stefan Kost <email>ensonic@sonicpulse.de</email>;
  661. </para>
  662. </listitem>
  663. <listitem>
  664. <para>
  665. or jEdit-users mailing-list
  666. <email>jedit-users@lists.sourceforge.net</email>;
  667. </para>
  668. </listitem>
  669. <listitem>
  670. <para>
  671. or jEdit-devel mailing-list
  672. <email>jedit-devel@lists.sourceforge.net</email>.
  673. </para>
  674. </listitem>
  675. </itemizedlist>
  676. </chapter>
  677. <chapter id="credits">
  678. <title>Credits</title>
  679. <itemizedlist>
  680. <listitem>
  681. <para>
  682. ProjectViewer was previously (up to 1.0.2) maintained by Calvin Yu
  683. </para>
  684. </listitem>
  685. <listitem>
  686. <para>
  687. ProjectViewer was originally developed Kevin A. Burton
  688. </para>
  689. </listitem>
  690. </itemizedlist>
  691. </chapter>
  692. </book>