--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="lib" path="lib/xmlrpc-1.1.jar"/>
+ <classpathentry sourcepath="/radeox.cvs/src" kind="lib" path="lib/radeox.jar"/>
+ <classpathentry kind="lib" path="lib/commons-logging.jar"/>
+ <classpathentry kind="lib" path="lib/commons-httpclient-2.0.2.jar"/>
+ <classpathentry kind="lib" path="lib/java2html_4.1.jar"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+ <classpathentry kind="lib" path="lib/plog4u.jar"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>net.sourceforge.phpeclipse.wiki</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+source.wiki.jar = src/
+output.wiki.jar = bin/
+bin.includes = plugin.xml,\
+ wiki.jar,\
+ icons/,\
+ commons-httpclient-2.0.2.jar,\
+ commons-logging.jar,\
+ radeox.jar,\
+ templates/
+src.includes = .classpath,\
+ .project,\
+ build.properties,\
+ src/
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="net.sourceforge.phpeclipse.wiki" default="build.jars" basedir=".">
+
+ <property name="bootclasspath" value=""/>
+ <property name="basews" value="${ws}"/>
+ <property name="baseos" value="${os}"/>
+ <property name="basearch" value="${arch}"/>
+ <property name="basenl" value="${nl}"/>
+ <property name="javacFailOnError" value="false"/>
+ <property name="javacDebugInfo" value="on"/>
+ <property name="javacVerbose" value="true"/>
+ <property name="javacSource" value="1.3"/>
+ <property name="javacTarget" value="1.2"/>
+ <property name="compilerArg" value=""/>
+
+ <target name="init" depends="properties">
+ <condition property="pluginTemp" value="${buildTempFolder}/plugins">
+ <isset property="buildTempFolder"/>
+ </condition>
+ <property name="pluginTemp" value="${basedir}"/>
+ <condition property="build.result.folder" value="${pluginTemp}/net.sourceforge.phpeclipse.wiki">
+ <isset property="buildTempFolder"/>
+ </condition>
+ <property name="build.result.folder" value="${basedir}"/>
+ <property name="temp.folder" value="${basedir}/temp.folder"/>
+ <property name="plugin.destination" value="${basedir}"/>
+ </target>
+
+ <target name="properties" if="eclipse.running">
+ <property name="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>
+ </target>
+
+ <target name="build.update.jar" depends="init" description="Build the plug-in: net.sourceforge.phpeclipse.wiki for an update site.">
+ <delete dir="${temp.folder}"/>
+ <mkdir dir="${temp.folder}"/>
+ <antcall target="build.jars"/>
+ <antcall target="gather.bin.parts">
+ <param name="destination.temp.folder" value="${temp.folder}/"/>
+ </antcall>
+ <zip zipfile="${plugin.destination}/net.sourceforge.phpeclipse.wiki_1.1.1.jar" basedir="${temp.folder}/net.sourceforge.phpeclipse.wiki_1.1.1" filesonly="false" whenempty="skip" update="false"/>
+ <delete dir="${temp.folder}"/>
+ </target>
+
+ <target name="wiki.jar" depends="init" unless="wiki.jar" description="Create jar: wiki.jar.">
+ <delete dir="${temp.folder}/wiki.jar.bin"/>
+ <mkdir dir="${temp.folder}/wiki.jar.bin"/>
+ <!-- compile the source code -->
+ <javac destdir="${temp.folder}/wiki.jar.bin" failonerror="${javacFailOnError}" verbose="${javacVerbose}" debug="${javacDebugInfo}" includeAntRuntime="no" bootclasspath="${bootclasspath}" source="${javacSource}" target="${javacTarget}" >
+ <compilerarg line="${compilerArg}"/>
+ <classpath>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.ide_3.0.1/ide.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.win32_3.0.1/ide.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.win32_3.0.1/workbenchwin32.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.core.resources_3.0.1/resources.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.core.resources.win32_3.0.0/resources.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.core.resources.win32_3.0.0/resources-win32.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.core.runtime.compatibility_3.0.0/compatibility.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.core.runtime_3.0.1/runtime.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.osgi_3.0.1/core.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.osgi_3.0.1/console.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.osgi_3.0.1/osgi.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.osgi_3.0.1/resolver.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.osgi_3.0.1/defaultAdaptor.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.osgi_3.0.1/eclipseAdaptor.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.update.configurator_3.0.0/configurator.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.help_3.0.0/help.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui_3.0.1/ui.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.swt_3.0.1/ws/${basews}/swt.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.swt.win32_3.0.1/ws/${basews}/swt.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.swt.win32_3.0.1"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.jface_3.0.0/jface.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.workbench_3.0.1/compatibility.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.workbench_3.0.1/workbench.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.workbench.compatibility_3.0.0/compatibility.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.workbench.compatibility_3.0.0/workbench.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.core.expressions_3.0.0/expressions.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.views_3.0.0/views.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.update.core_3.0.1/updatecore.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.update.core.win32_3.0.0/updatecore.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.update.ui_3.0.1/updateui.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.help.base_3.0.1/helpbase.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.apache.lucene_1.3.1/parser.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.apache.lucene_1.3.1/lucene-1.3-final.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.help.appserver_3.0.0/appserver.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.forms_3.0.0/forms.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.jface.text_3.0.1/jfacetext.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.text_3.0.1/text.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.editors_3.0.1/editors.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.ui.workbench.texteditor_3.0.1/texteditor.jar"/>
+ <pathelement path="../../../eclipse301/plugins/org.eclipse.core.filebuffers_3.0.1/filebuffers.jar"/>
+ <pathelement path="../net.sourceforge.phpeclipse.webbrowser/bin"/>
+ <pathelement path="../net.sourceforge.phpeclipse.webbrowser/webbrowser.jar"/>
+ <pathelement path="radeox.jar"/>
+ <pathelement path="commons-logging.jar"/>
+ <pathelement path="commons-httpclient-2.0.2.jar"/>
+ </classpath>
+ <src path="src/" />
+ </javac>
+ <!-- Copy necessary resources -->
+ <copy todir="${temp.folder}/wiki.jar.bin" failonerror="true">
+ <fileset dir="src/" excludes="**/*.java, **/package.htm*" />
+ </copy>
+ <mkdir dir="${build.result.folder}"/>
+ <jar jarfile="${build.result.folder}/wiki.jar" basedir="${temp.folder}/wiki.jar.bin"/>
+ <delete dir="${temp.folder}/wiki.jar.bin"/>
+ </target>
+
+ <target name="wikisrc.zip" depends="init" unless="wikisrc.zip">
+ <mkdir dir="${build.result.folder}"/>
+ <zip zipfile="${build.result.folder}/wikisrc.zip" filesonly="false" whenempty="skip" update="false">
+ <fileset dir="src/" includes="**/*.java" />
+ </zip>
+ </target>
+
+ <target name="build.jars" depends="init" description="Build all the jars for the plug-in: net.sourceforge.phpeclipse.wiki.">
+ <available property="wiki.jar" file="${build.result.folder}/wiki.jar"/>
+ <antcall target="wiki.jar"/>
+ </target>
+
+ <target name="build.sources" depends="init">
+ <available property="wikisrc.zip" file="${build.result.folder}/wikisrc.zip"/>
+ <antcall target="wikisrc.zip"/>
+ </target>
+
+ <target name="gather.bin.parts" depends="init" if="destination.temp.folder">
+ <mkdir dir="${destination.temp.folder}/net.sourceforge.phpeclipse.wiki_1.1.1"/>
+ <copy todir="${destination.temp.folder}/net.sourceforge.phpeclipse.wiki_1.1.1" failonerror="true">
+ <fileset dir="${build.result.folder}" includes="wiki.jar" />
+ </copy>
+ <copy todir="${destination.temp.folder}/net.sourceforge.phpeclipse.wiki_1.1.1" failonerror="true">
+ <fileset dir="${basedir}" includes="plugin.xml,wiki.jar,icons/,commons-httpclient-2.0.2.jar,commons-logging.jar,radeox.jar,templates/" />
+ </copy>
+ </target>
+
+ <target name="build.zips" depends="init">
+ </target>
+
+ <target name="gather.sources" depends="init" if="destination.temp.folder">
+ <mkdir dir="${destination.temp.folder}/net.sourceforge.phpeclipse.wiki_1.1.1"/>
+ <copy file="${build.result.folder}/wikisrc.zip" todir="${destination.temp.folder}/net.sourceforge.phpeclipse.wiki_1.1.1" failonerror="false"/>
+ <copy todir="${destination.temp.folder}/net.sourceforge.phpeclipse.wiki_1.1.1" failonerror="false">
+ <fileset dir="${basedir}" includes=".classpath,.project,build.properties,src/" />
+ </copy>
+ </target>
+
+ <target name="gather.logs" depends="init" if="destination.temp.folder">
+ <mkdir dir="${destination.temp.folder}/net.sourceforge.phpeclipse.wiki_1.1.1"/>
+ <copy file="${temp.folder}/wiki.jar.bin.log" todir="${destination.temp.folder}/net.sourceforge.phpeclipse.wiki_1.1.1" failonerror="false"/>
+ </target>
+
+ <target name="clean" depends="init" description="Clean the plug-in: net.sourceforge.phpeclipse.wiki of all the zips, jars and logs created.">
+ <delete file="${build.result.folder}/wiki.jar"/>
+ <delete file="${build.result.folder}/wikisrc.zip"/>
+ <delete file="${plugin.destination}/net.sourceforge.phpeclipse.wiki_1.1.1.jar"/>
+ <delete file="${plugin.destination}/net.sourceforge.phpeclipse.wiki_1.1.1.zip"/>
+ <delete dir="${temp.folder}"/>
+ </target>
+
+ <target name="refresh" depends="init" if="eclipse.running" description="Refresh this folder.">
+ <eclipse.convertPath fileSystemPath="C:/eclipse3/workspace/net.sourceforge.phpeclipse.wiki" property="resourcePath"/>
+ <eclipse.refreshLocal resource="${resourcePath}" depth="infinite"/>
+ </target>
+
+ <target name="zip.plugin" depends="init" description="Create a zip containing all the elements for the plug-in: net.sourceforge.phpeclipse.wiki.">
+ <delete dir="${temp.folder}"/>
+ <mkdir dir="${temp.folder}"/>
+ <antcall target="build.jars"/>
+ <antcall target="build.sources"/>
+ <antcall target="gather.bin.parts">
+ <param name="destination.temp.folder" value="${temp.folder}/"/>
+ </antcall>
+ <antcall target="gather.sources">
+ <param name="destination.temp.folder" value="${temp.folder}/"/>
+ </antcall>
+ <delete>
+ <fileset dir="${temp.folder}" includes="**/*.bin.log" />
+ </delete>
+ <zip zipfile="${plugin.destination}/net.sourceforge.phpeclipse.wiki_1.1.1.zip" basedir="${temp.folder}" filesonly="true" whenempty="skip" update="false"/>
+ <delete dir="${temp.folder}"/>
+ </target>
+
+</project>
--- /dev/null
+MediaWiki.label=Wikipedia
+HTTPQuery.label=HTTP Query
+
+# --------------- General UI ---------------
+preferenceDescription=Configure HTTP Actions for your Wiki texts.
+configurationsList=Configurations
+columnUser=User Name
+columnURL=URL
+columnType=Type
+columnStatus=Active
+add=Add...
+edit=Edit...
+remove=Remove
+start=Activate
+stop=Deactivate
+started=True
+stopped=False
+
+newConfig=New Configuration
+editConfig=Edit Configuration
+
+user=User:
+remoteGroup=Configuration
+url=URL:
+password=Password:
+parseType=Type:
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin
+ id="net.sourceforge.phpeclipse.wiki"
+ name="Wikipedia Editor Plug-in"
+ version="1.1.1"
+ provider-name="www.phpeclipse.de"
+ class="net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin">
+
+ <runtime>
+ <library name="wiki.jar">
+ <export name="*"/>
+ </library>
+ <library name="lib/xmlrpc-1.1.jar"/>
+ <library name="lib/radeox.jar"/>
+ <library name="lib/commons-logging.jar"/>
+ <library name="lib/commons-httpclient-2.0.2.jar"/>
+ <library name="lib/java2html_4.1.jar"/>
+ <library name="lib/plog4u.jar"/>
+ </runtime>
+ <requires>
+ <import plugin="org.eclipse.core.runtime.compatibility"/>
+ <import plugin="org.eclipse.ui.ide"/>
+ <import plugin="org.eclipse.core.resources"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.swt"/>
+ <import plugin="org.eclipse.ui.forms"/>
+ <import plugin="org.eclipse.ui.views"/>
+ <import plugin="org.eclipse.core.runtime"/>
+ <import plugin="org.eclipse.jface.text"/>
+ <import plugin="org.eclipse.ui"/>
+ <import plugin="org.eclipse.ui.views"/>
+ <import plugin="org.eclipse.ui.editors"/>
+ <import plugin="org.eclipse.ui.workbench.texteditor"/>
+ <import plugin="net.sourceforge.phpeclipse.webbrowser"/>
+ </requires>
+
+ <extension
+ point="org.eclipse.ui.editors">
+ <editor
+ icon="icons/text.gif"
+ class="net.sourceforge.phpeclipse.wiki.editor.WikiEditor"
+ default="true"
+ contributorClass="net.sourceforge.phpeclipse.wiki.editor.WikiEditorContributor"
+ name="WikiEditor"
+ id="net.sourceforge.phpeclipse.wiki.editor"
+ extensions="wp"/>
+ </extension>
+ <extension
+ point="org.eclipse.ui.editors.templates">
+ <contextType
+ class="org.eclipse.jface.text.templates.TemplateContextType"
+ name="Wikipedia Templates"
+ id="net.sourceforge.phpeclipse.wiki.editor.templates"/>
+ <include file="templates/templates.xml"/>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.editors.markerAnnotationSpecification">
+ <specification
+ annotationType="net.sourceforge.phpeclipse.wiki.editor.highlightannotation"
+ verticalRulerPreferenceKey="highlight.rulers.vertical"
+ textPreferenceKey="highlight.text"
+ colorPreferenceKey="highlight.color"
+ highlightPreferenceKey="highlight.background"
+ textPreferenceValue="false"
+ textStylePreferenceValue="UNDERLINE"
+ overviewRulerPreferenceKey="highlight.rulers.overview"
+ presentationLayer="4"
+ highlightPreferenceValue="true"
+ label="Zutaten"
+ icon="icons/occurrence.gif"
+ colorPreferenceValue="253,255,157"
+ verticalRulerPreferenceValue="true"
+ overviewRulerPreferenceValue="true"
+ textStylePreferenceKey="highlight.text.style">
+ </specification>
+ </extension>
+
+ <!-- linked annotations -->
+ <extension
+ point="org.eclipse.ui.editors.markerAnnotationSpecification">
+ <specification
+ annotationType="org.eclipse.jdt.ui.link.master"
+ colorPreferenceValue="70,100,165"
+ colorPreferenceKey="linked.focus.color"
+ isGoToPreviousNavigationTarget="false"
+ isGoToPreviousNavigationTargetKey="linked.focus.navigation.previous"
+ showInNextPrevDropdownToolbarAction="false"
+ showInNextPrevDropdownToolbarActionKey="linked.focus.navigation.dropdown"
+ isGoToNextNavigationTarget="false"
+ isGoToNextNavigationTargetKey="linked.focus.navigation.next"
+ contributesToHeader="false"
+ overviewRulerPreferenceValue="false"
+ presentationLayer="4"
+ label="Linked Position (Focus)"
+ textPreferenceValue="true"
+ textPreferenceKey="linked.focus.text"
+ highlightPreferenceKey="linked.focus.highlight"
+ highlightPreferenceValue="false"
+ textStylePreferenceKey="linked.focus.text.style"
+ textStylePreferenceValue="BOX"
+ verticalRulerPreferenceKey="linked.focus.verticalruler"
+ verticalRulerPreferenceValue="false"
+ overviewRulerPreferenceKey="linked.focus.overviewruler">
+ </specification>
+ <specification
+ annotationType="org.eclipse.jdt.ui.link.slave"
+ colorPreferenceValue="180,215,255"
+ colorPreferenceKey="linked.slave.color"
+ isGoToPreviousNavigationTarget="false"
+ isGoToPreviousNavigationTargetKey="linked.slave.navigation.previous"
+ showInNextPrevDropdownToolbarAction="false"
+ showInNextPrevDropdownToolbarActionKey="linked.slave.navigation.dropdown"
+ isGoToNextNavigationTarget="false"
+ isGoToNextNavigationTargetKey="linked.slave.navigation.next"
+ contributesToHeader="false"
+ overviewRulerPreferenceValue="false"
+ presentationLayer="4"
+ label="Linked Position (Slave)"
+ textPreferenceValue="false"
+ textPreferenceKey="linked.slave.text"
+ highlightPreferenceKey="linked.slave.highlight"
+ highlightPreferenceValue="true"
+ textStylePreferenceKey="linked.slave.text.style"
+ textStylePreferenceValue="NONE"
+ verticalRulerPreferenceKey="linked.slave.verticalruler"
+ verticalRulerPreferenceValue="false"
+ overviewRulerPreferenceKey="linked.slave.overviewruler">
+ </specification>
+ <specification
+ annotationType="org.eclipse.jdt.ui.link.target"
+ colorPreferenceValue="70,100,165"
+ colorPreferenceKey="linked.target.color"
+ isGoToPreviousNavigationTarget="false"
+ isGoToPreviousNavigationTargetKey="linked.target.navigation.previous"
+ showInNextPrevDropdownToolbarAction="false"
+ showInNextPrevDropdownToolbarActionKey="linked.target.navigation.dropdown"
+ isGoToNextNavigationTarget="false"
+ isGoToNextNavigationTargetKey="linked.target.navigation.next"
+ contributesToHeader="false"
+ overviewRulerPreferenceValue="false"
+ presentationLayer="4"
+ label="Linked Position (Target)"
+ textPreferenceValue="true"
+ textPreferenceKey="linked.target.text"
+ highlightPreferenceKey="linked.target.highlight"
+ highlightPreferenceValue="false"
+ textStylePreferenceKey="linked.target.text.style"
+ textStylePreferenceValue="BOX"
+ verticalRulerPreferenceKey="linked.target.verticalruler"
+ verticalRulerPreferenceValue="false"
+ overviewRulerPreferenceKey="linked.target.overviewruler">
+ </specification>
+ <specification
+ annotationType="org.eclipse.jdt.ui.link.exit"
+ colorPreferenceValue="0,180,0"
+ colorPreferenceKey="linked.exit.color"
+ isGoToPreviousNavigationTarget="false"
+ isGoToPreviousNavigationTargetKey="linked.exit.navigation.previous"
+ showInNextPrevDropdownToolbarAction="false"
+ showInNextPrevDropdownToolbarActionKey="linked.exit.navigation.dropdown"
+ isGoToNextNavigationTarget="false"
+ isGoToNextNavigationTargetKey="linked.exit.navigation.next"
+ contributesToHeader="false"
+ overviewRulerPreferenceValue="false"
+ presentationLayer="4"
+ label="Linked Position (Exit)"
+ textPreferenceValue="true"
+ textPreferenceKey="linked.exit.text"
+ highlightPreferenceKey="linked.exit.highlight"
+ highlightPreferenceValue="false"
+ textStylePreferenceKey="linked.exit.text.style"
+ textStylePreferenceValue="IBEAM"
+ verticalRulerPreferenceKey="linked.exit.verticalruler"
+ verticalRulerPreferenceValue="false"
+ overviewRulerPreferenceKey="linked.exit.overviewruler">
+ </specification>
+ </extension>
+ <extension
+ id="wikibuilder"
+ name="Wiki Builder"
+ point="org.eclipse.core.resources.builders">
+ <builder>
+ <run class="net.sourceforge.phpeclipse.wiki.builder.WikiBuilder"/>
+ </builder>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.popupMenus">
+ <objectContribution
+ adaptable="false"
+ objectClass="org.eclipse.core.resources.IProject"
+ id="net.sourceforge.phpeclipse.wiki.addwikibuilder">
+ <action
+ label="Add Wiki Builder"
+ class="net.sourceforge.phpeclipse.wiki.builder.AddBuilderAction"
+ menubarPath="additions"
+ id="net.sourceforge.phpeclipse.wiki.builder.AddBuilderAction">
+ </action>
+ </objectContribution>
+ <!-- <objectContribution
+ adaptable="false"
+ objectClass="org.eclipse.core.resources.IFile"
+ id="net.sourceforge.phpeclipse.wiki.createpager">
+ <action
+ label="Create HTML Page"
+ class="net.sourceforge.phpeclipse.wiki.builder.CreatePageAction"
+ menubarPath="additions"
+ id="net.sourceforge.phpeclipse.wiki.builder.CreatePageAction">
+ </action>
+ </objectContribution> -->
+ </extension>
+
+ <extension point="org.eclipse.ui.preferencePages">
+ <page
+ name="Wiki Configurations"
+ id="net.sourceforge.phpeclipse.wiki.ui.internal.configurationPreferencePage"
+ class="net.sourceforge.phpeclipse.wiki.ui.internal.ConfigurationPreferencePage"/>
+ <page
+ name="Wiki Project Defaults"
+ class="net.sourceforge.phpeclipse.wiki.preferences.WikiProjectPreferences"
+ id="net.sourceforge.phpeclipse.wiki.preferences.WikiProjectPreferences">
+ </page>
+ </extension>
+ <extension
+ point="org.eclipse.ui.propertyPages">
+ <page
+ objectClass="org.eclipse.core.resources.IProject"
+ name="Static Wiki Project Settings"
+ class="net.sourceforge.phpeclipse.wiki.preferences.WikiProjectPreferences"
+ id="net.sourceforge.phpeclipse.wiki.preferences.WikiProjectPreferences">
+ </page>
+ </extension>
+
+ <extension
+ point="org.eclipse.ui.popupMenus">
+ <viewerContribution
+ targetID="#PHPEditorContext"
+ id="net.sourceforge.phpeclipse.wiki.phpeditor.viewercontribution">
+ <action
+ label="Open Wiki Link"
+ class="net.sourceforge.phpeclipse.wiki.actions.OpenWikiLinkEditorAction"
+ menubarPath="additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.OpenWikiLinkEditorAction">
+ </action>
+ <action
+ label="Post to pLog4U.de"
+ class="net.sourceforge.phpeclipse.wiki.actions.NewPostBlogEditorAction"
+ menubarPath="additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.NewPostBlogEditorAction">
+ </action>
+ </viewerContribution>
+
+ <viewerContribution
+ targetID="#CompilationUnitEditorContext"
+ id="net.sourceforge.phpeclipse.wiki.phpeditor.viewercontribution">
+ <action
+ label="Open Wiki Link"
+ class="net.sourceforge.phpeclipse.wiki.actions.OpenWikiLinkEditorAction"
+ menubarPath="additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.OpenWikiLinkEditorAction">
+ </action>
+ <action
+ label="Post to pLog4U.de"
+ class="net.sourceforge.phpeclipse.wiki.actions.NewPostBlogEditorAction"
+ menubarPath="additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.NewPostBlogEditorAction">
+ </action>
+ </viewerContribution>
+ <viewerContribution
+ targetID="#EditorContext"
+ id="net.sourceforge.phpeclipse.wiki.texteditor.viewercontribution">
+ <action
+ label="Open Wiki Link"
+ class="net.sourceforge.phpeclipse.wiki.actions.OpenWikiLinkEditorAction"
+ menubarPath="additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.OpenWikiLinkEditorAction">
+ </action>
+ <action
+ label="Post to pLog4U.de"
+ class="net.sourceforge.phpeclipse.wiki.actions.NewPostBlogEditorAction"
+ menubarPath="additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.NewPostBlogEditorAction">
+ </action>
+ </viewerContribution>
+ <viewerContribution
+ targetID="#PHPEditorContext"
+ id="net.sourceforge.phpeclipse.wiki.phpeditor.viewercontribution">
+ <menu
+ id="mediawikiMenu"
+ label="%MediaWiki.label"
+ path="rest">
+ </menu>
+ <action
+ label="Refresh Current Wiki Text (Wikibooks.org)"
+ class="net.sourceforge.phpeclipse.wiki.actions.mediawiki.RefreshWikiTextEditorAction"
+ menubarPath="mediawikiMenu/additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.mediawiki.RefreshWikiTextEditorAction">
+ </action>
+ <action
+ label="Download Link's Wiki Text (Wikibooks.org)"
+ class="net.sourceforge.phpeclipse.wiki.actions.mediawiki.DownloadWikiLinkEditorAction"
+ menubarPath="mediawikiMenu/additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.mediawiki.DownloadWikiLinkEditorAction">
+ </action>
+ </viewerContribution>
+ <viewerContribution
+ targetID="#EditorContext"
+ id="net.sourceforge.phpeclipse.wiki.texteditor.viewercontribution">
+ <menu
+ id="mediawikiMenu"
+ label="%MediaWiki.label"
+ path="rest">
+ </menu>
+ <action
+ label="Refresh Current Wiki Text (Wikibooks.org)"
+ class="net.sourceforge.phpeclipse.wiki.actions.mediawiki.RefreshWikiTextEditorAction"
+ menubarPath="mediawikiMenu/additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.mediawiki.RefreshWikiTextEditorAction">
+ </action>
+ <action
+ label="Download Link's Wiki Text (Wikibooks.org)"
+ class="net.sourceforge.phpeclipse.wiki.actions.mediawiki.DownloadWikiLinkEditorAction"
+ menubarPath="mediawikiMenu/additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.mediawiki.DownloadWikiLinkEditorAction">
+ </action>
+ </viewerContribution>
+ <viewerContribution
+ targetID="#CompilationUnitEditorContext"
+ id="net.sourceforge.phpeclipse.wiki.phpeditor.viewercontribution">
+ <menu
+ id="httpqueryMenu"
+ label="%HTTPQuery.label"
+ path="rest">
+ </menu>
+ <action
+ label="Run HTTP Query"
+ class="net.sourceforge.phpeclipse.wiki.actions.httpquery.HTTPQueryAction"
+ menubarPath="httpqueryMenu/additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.httpquery.HTTPQueryAction">
+ </action>
+ </viewerContribution>
+ <viewerContribution
+ targetID="#PHPEditorContext"
+ id="net.sourceforge.phpeclipse.wiki.phpeditor.viewercontribution">
+ <menu
+ id="httpqueryMenu"
+ label="%HTTPQuery.label"
+ path="rest">
+ </menu>
+ <action
+ label="Run HTTP Query"
+ class="net.sourceforge.phpeclipse.wiki.actions.httpquery.HTTPQueryAction"
+ menubarPath="httpqueryMenu/additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.httpquery.HTTPQueryAction">
+ </action>
+ </viewerContribution>
+ <viewerContribution
+ targetID="#EditorContext"
+ id="net.sourceforge.phpeclipse.wiki.texteditor.viewercontribution">
+ <menu
+ id="httpqueryMenu"
+ label="%HTTPQuery.label"
+ path="rest">
+ </menu>
+ <action
+ label="Run HTTP Query"
+ class="net.sourceforge.phpeclipse.wiki.actions.httpquery.HTTPQueryAction"
+ menubarPath="httpqueryMenu/additions"
+ id="net.sourceforge.phpeclipse.wiki.actions.httpquery.HTTPQueryAction">
+ </action>
+ </viewerContribution>
+ </extension>
+ <extension
+ name="Wikipedia"
+ point="org.eclipse.ui.exportWizards">
+ <wizard
+ name="Wikipedia"
+ class="net.sourceforge.phpeclipse.wiki.export.WikiExportWizard"
+ id="WikiWizard">
+ </wizard>
+ </extension>
+</plugin>
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.wiki.blog.Configuration;
+import net.sourceforge.phpeclipse.wiki.blog.MetaWeblog;
+import net.sourceforge.phpeclipse.wiki.builder.CreatePageAction;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditor;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+import net.sourceforge.phpeclipse.wiki.renderer.IContentRenderer;
+import net.sourceforge.phpeclipse.wiki.renderer.RendererFactory;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+
+public final class NewPostBlogEditorAction implements IEditorActionDelegate {
+ // public static String APPKEY =
+ // "1c0c75ffffffb512ffffff9575ffffff97ffffffd2ffffff87ffffff91ffffffe41dffffffc5320cffffffab544effffffc0546459ffffff83";
+
+ private IWorkbenchWindow window;
+
+ private AbstractTextEditor fEditor;
+
+ public void dispose() {
+ }
+
+ public void init(IWorkbenchWindow window) {
+ this.window = window;
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection.isEmpty()) {
+ return;
+ }
+ if (selection instanceof TextSelection) {
+ action.setEnabled(true);
+ return;
+ }
+ if (window.getActivePage() != null && window.getActivePage().getActivePart() != null) {
+ action.setEnabled(window.getActivePage().getActivePart().getClass().equals(WikiEditor.class));
+ }
+ }
+
+ public void run(IAction action) {
+ if (fEditor == null) {
+ IEditorPart targetEditor = window.getActivePage().getActiveEditor();
+ if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+ fEditor = (AbstractTextEditor) targetEditor;
+ }
+ }
+ if (fEditor != null) {
+ try {
+ Configuration config = new Configuration("http://localhost:8080/snip/RPC2", "1", "admin", "admin");
+ IFileEditorInput ei = (IFileEditorInput) fEditor.getEditorInput();
+ IFile file = ei.getFile();
+ StringBuffer htmlBuffer = new StringBuffer();
+ CreatePageAction.getWikiBuffer(htmlBuffer,file);
+
+ ArrayList images = new ArrayList();
+ getImages(htmlBuffer, images);
+
+ String[] result = new String[2];
+ boolean cache = config.promptForPassword(config.getUser(), "Insert Config", true, result);
+ if (result[0] == null || result[1] == null) {
+ return;
+ }
+ if (result[0].equals("") || result[1].equals("")) {
+ return;
+ }
+
+ String title = Util.getWikiTitle(file);
+ if (title != null) {
+ MetaWeblog metaWebLog = new MetaWeblog(config);
+ String guid = metaWebLog.newPost(file, title, htmlBuffer, true);
+ System.out.println(guid);
+
+ if (images.size() > 0) {
+ String fullImagePath;
+ String filePath = file.getLocation().toString();
+ int index = filePath.lastIndexOf('/');
+ if (index>=0) {
+ filePath = filePath.substring(0,index+1);
+ }
+ for (int i = 0; i < images.size(); i++) {
+ fullImagePath = filePath+"Image/"+images.get(i).toString();
+ metaWebLog.publishAttachement(guid, fullImagePath, false);
+ }
+ }
+ } else {
+ MessageDialog.openError(null, "Undefined Blog Title: ", "Blog file name must end with *.wp");
+ }
+ } catch (Exception e) {
+ MessageDialog.openError(null, "Exception: ", e.toString());
+ e.printStackTrace();
+ }
+ }
+ }
+
+ /**
+ * @param content the wikitext
+ * @param images result List of image names
+ */
+ private void getImages(StringBuffer content, List images) {
+ int startIndex = 0;
+ int endIndex = 0;
+ String imageName;
+ while (startIndex >= 0) {
+ startIndex = content.indexOf("[[Image:", startIndex);
+ if (startIndex >= 0) {
+ endIndex = content.indexOf("]]", startIndex + 8);
+ if (endIndex < 0) {
+ return;
+ }
+ imageName = content.substring(startIndex + 8, endIndex);
+ images.add(imageName);
+ startIndex += 8;
+ }
+ }
+ }
+
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+ fEditor = (AbstractTextEditor) targetEditor;
+ }
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions;
+
+import net.sourceforge.phpeclipse.wiki.blog.Configuration;
+import net.sourceforge.phpeclipse.wiki.blog.MetaWeblog;
+import net.sourceforge.phpeclipse.wiki.builder.CreatePageAction;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditor;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+import net.sourceforge.phpeclipse.wiki.renderer.IContentRenderer;
+import net.sourceforge.phpeclipse.wiki.renderer.RendererFactory;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+
+public final class NewPostBlogHTMLAction implements IEditorActionDelegate {
+ // public static String APPKEY =
+ // "1c0c75ffffffb512ffffff9575ffffff97ffffffd2ffffff87ffffff91ffffffe41dffffffc5320cffffffab544effffffc0546459ffffff83";
+
+ private IWorkbenchWindow window;
+
+ private AbstractTextEditor fEditor;
+
+ public void dispose() {
+ }
+
+ public void init(IWorkbenchWindow window) {
+ this.window = window;
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection.isEmpty()) {
+ return;
+ }
+ if (selection instanceof TextSelection) {
+ action.setEnabled(true);
+ return;
+ }
+ if (window.getActivePage() != null && window.getActivePage().getActivePart() != null) {
+ action.setEnabled(window.getActivePage().getActivePart().getClass().equals(WikiEditor.class));
+ }
+ }
+
+ public void run(IAction action) {
+ if (fEditor == null) {
+ IEditorPart targetEditor = window.getActivePage().getActiveEditor();
+ if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+ fEditor = (AbstractTextEditor) targetEditor;
+ }
+ }
+ if (fEditor != null) {
+ try {
+ Configuration config = new Configuration("http://localhost:8080/blog/default", "1", "root", "******");
+ IFileEditorInput ei = (IFileEditorInput) fEditor.getEditorInput();
+ IFile file = ei.getFile();
+ IContentRenderer renderer = RendererFactory.createContentRenderer(file.getProject());
+ StringBuffer htmlBuffer = new StringBuffer();
+ CreatePageAction.convertWikiBuffer(htmlBuffer, file, renderer, false);
+
+ String[] result = new String[2];
+ boolean cache = config.promptForPassword(config.getUser(), "Insert Config", true, result);
+ if (result[0] == null || result[1] == null) {
+ return;
+ }
+ if (result[0].equals("") || result[1].equals("") ) {
+ return;
+ }
+
+ String title = Util.getWikiTitle(file);
+ if (title != null) {
+ MetaWeblog metaWebLog = new MetaWeblog(config);
+ String guid = metaWebLog.newPost(file, title, htmlBuffer, true);
+ System.out.println(guid);
+ } else {
+ MessageDialog.openError(null, "Undefined Blog Title: ", "Blog file name must end with *.wp");
+ }
+ } catch (Exception e) {
+ MessageDialog.openError(null, "Exception: ", e.toString());
+ e.printStackTrace();
+ }
+ // try {
+ // IFileEditorInput ei = (IFileEditorInput) fEditor.getEditorInput();
+ // IFile file = ei.getFile();
+ // IContentRenderer renderer = RendererFactory.createContentRenderer(file.getProject());
+ // StringBuffer htmlBuffer = new StringBuffer();
+ // CreatePageAction.convertWikiBuffer(htmlBuffer, file, renderer, false);
+ // XmlRpcClientLite xmlrpc = new XmlRpcClientLite("http://www.plog4u.de/xmlrpc.php");
+ // Vector rpcParams = new Vector();
+ // rpcParams.add(APPKEY);
+ // rpcParams.add("1"); // blog.getBlogId());
+ // rpcParams.add("admin");
+ // rpcParams.add("******"); // fPassword
+ // rpcParams.add(htmlBuffer.toString()); //getContent());
+ // rpcParams.add(Boolean.TRUE); // publish == yes
+ //
+ // String postId = (String) xmlrpc.execute("blogger.newPost", rpcParams);
+ //
+ // // return postId;
+ // } catch (Exception e) {
+ // e.printStackTrace();
+ // // return null;
+ // }
+ }
+ }
+
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+ fEditor = (AbstractTextEditor) targetEditor;
+ }
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions;
+
+import java.io.ByteArrayInputStream;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditor;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceStatus;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+
+public final class OpenWikiLinkEditorAction implements IEditorActionDelegate {
+
+ private IWorkbenchWindow window;
+
+ private AbstractTextEditor editor;
+
+ public void dispose() {
+ }
+
+ public void init(IWorkbenchWindow window) {
+ this.window = window;
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection.isEmpty()) {
+ return;
+ }
+ if (selection instanceof TextSelection) {
+ action.setEnabled(true);
+ return;
+ }
+ if (window.getActivePage() != null && window.getActivePage().getActivePart() != null) {
+ action.setEnabled(window.getActivePage().getActivePart().getClass().equals(WikiEditor.class));
+ }
+ }
+
+ public void run(IAction action) {
+ if (editor == null) {
+ IEditorPart targetEditor = window.getActivePage().getActiveEditor();
+ if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+ editor = (AbstractTextEditor) targetEditor;
+ }
+ }
+ if (editor != null) {
+ openWikiLinkOnSelection();
+ }
+ }
+
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+ editor = (AbstractTextEditor) targetEditor;
+ }
+ }
+
+ public static String getWikiString(AbstractTextEditor editor, IDocument document, int initialPos) {
+ try {
+ int pos = initialPos;
+ int line = document.getLineOfOffset(pos);
+ int start = document.getLineOffset(line);
+ int end = start + document.getLineInformation(line).getLength();
+
+ /*
+ * The line does not include \n or \r so pos can be > end. Making pos = end in this case is safe for the purposes of
+ * determining the TextRegion at the cursor position
+ */
+ if (pos > end) {
+ pos = end;
+ }
+
+ int offsetInLine = pos - start;
+ String word = document.get(start, end - start);
+ int wordlen = word.length();
+ int wikiLinkStart = -1;
+ int wikiLinkEnd = -1;
+
+ for (int i = offsetInLine; i < wordlen; i++) {
+ if (word.charAt(i) == ']' && i < wordlen - 1 && word.charAt(i + 1) == ']') {
+ wikiLinkEnd = i;
+ break;
+ }
+ if (word.charAt(i) == '|') {
+ wikiLinkEnd = i;
+ break;
+ }
+ if (word.charAt(i) == '#') {
+ wikiLinkEnd = i;
+ break;
+ }
+ }
+ for (int i = offsetInLine; i >= 0; i--) {
+ if (word.charAt(i) == '[' && i > 0 && word.charAt(i - 1) == '[') {
+ wikiLinkStart = i + 1;
+ break;
+ }
+ if (word.charAt(i) == '|') { // links wih different description
+ wikiLinkEnd = i;
+ }
+ if (word.charAt(i) == '#') { // for links with anchors
+ wikiLinkEnd = i;
+ }
+ }
+ if (wikiLinkStart != (-1) && wikiLinkEnd != (-1) && wikiLinkStart < wikiLinkEnd) {
+ return new String(word.toCharArray(), wikiLinkStart, wikiLinkEnd - wikiLinkStart);
+ }
+ } catch (BadLocationException e) {
+
+ }
+ return "";
+ }
+
+ public IDocument getDocument() {
+ IDocument doc = editor.getDocumentProvider().getDocument(editor.getEditorInput());
+ return doc;
+ }
+
+ public void openWikiLinkOnSelection() {
+ IDocument doc = getDocument();
+ ITextSelection selection = (ITextSelection) editor.getSelectionProvider().getSelection();
+ int pos = selection.getOffset();
+
+ String textRegion = getWikiString(editor, doc, pos);
+ IFileEditorInput ei = (IFileEditorInput) editor.getEditorInput();
+ openWikiFile(ei.getFile(), textRegion);
+ }
+
+ void openWikiFile(IFile cfile, String word) {
+ if (word != null && !word.equals("")) {
+ IFile file = getWikiFile(cfile, word);
+ try {
+ createNewFileIfNeeded(file, word);
+ // if (WikiEditorPlugin.getDefault().getPreferenceStore().getBoolean(WikiConstants.REUSE_EDITOR)) {
+ // saveIfNeeded();
+ // getActivePage().reuseEditor(reusableEditor, new FileEditorInput(file));
+ // } else {
+ IDE.openEditor(WikiEditorPlugin.getDefault().getActivePage(), file, true);
+ // redrawText();
+ // }
+ } catch (Exception e) {
+ // WikiEditorPlugin.getDefault().logAndReport(WikiEditorPlugin.getResourceString(WikiConstants.RESOURCE_WIKI_ERROR_DIALOGUE_OPEN_WIKI_FILE_TITLE),
+ // WikiPlugin.getResourceString(WikiConstants.RESOURCE_WIKI_ERROR_DIALOGUE_OPEN_WIKI_FILE_TEXT), e);
+ }
+ }
+ }
+
+ private void createNewFileIfNeeded(IFile file, String word) throws CoreException {
+ if (!file.exists()) {
+ createWikiFile(file, word);
+ }
+ }
+
+ private IFile getWikiFile(IFile file, String word) {
+ String wikiFileName = Util.getWikiFileName(word, file, WikiEditorPlugin.HTML_OUTPUT_PATH);
+ IPath path = new Path(wikiFileName);
+ return ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
+ }
+
+ /**
+ * Creates a folder resource handle for the folder with the given workspace path. This method does not create the folder resource;
+ * this is the responsibility of <code>createFolder</code>.
+ *
+ * @param folderPath
+ * the path of the folder resource to create a handle for
+ * @return the new folder resource handle
+ * @see #createFolder
+ */
+ private IFolder createFolderHandle(IPath folderPath) {
+ return IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getFolder(folderPath);
+ }
+
+ private void createFolder(IFolder folderHandle, IProgressMonitor monitor) throws CoreException {
+ try {
+ // Create the folder resource in the workspace
+ // Recursive to create any folders which do not exist already
+ if (!folderHandle.exists()) {
+ IContainer parent = folderHandle.getParent();
+ if (parent instanceof IFolder && (!((IFolder) parent).exists())) {
+ createFolder((IFolder) parent, monitor);
+ }
+ // if (linkTargetPath != null)
+ // folderHandle.createLink(linkTargetPath, IResource.ALLOW_MISSING_LOCAL, monitor);
+ // else
+ folderHandle.create(false, true, monitor);
+ }
+ } catch (CoreException e) {
+ // If the folder already existed locally, just refresh to get contents
+ if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED)
+ folderHandle.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 500));
+ else
+ throw e;
+ }
+ }
+
+ private void createWikiFile(IFile file, String word) throws CoreException {
+ IContainer parent = file.getParent();
+ if (parent instanceof IFolder && (!((IFolder) parent).exists())) {
+ createFolder((IFolder) parent, null);
+ }
+ String newText = "<!--" + word + "-->";
+ byte[] buffer = newText.getBytes();
+ ByteArrayInputStream source = new ByteArrayInputStream(buffer);
+ file.create(source, true, null);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions.httpquery;
+
+import java.net.URL;
+import java.text.BreakIterator;
+
+import net.sourceforge.phpeclipse.webbrowser.views.BrowserView;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+
+public abstract class AbstractHTTPQueryAction implements IEditorActionDelegate {
+
+ private IEditorPart targetEditor;
+
+ public AbstractHTTPQueryAction() {
+ super();
+ }
+
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ this.targetEditor = targetEditor;
+ }
+
+ abstract protected String getUrl(String selection);
+
+ public void run(IAction action) {
+ String selection = findSelectedText();
+ if (selection != null && selection.trim().length() > 0) {
+ URL url;
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ IWorkbenchPage page = window.getActivePage();
+ try {
+ IViewPart part = page.findView(BrowserView.ID_BROWSER);
+ if (part == null) {
+ part = page.showView(BrowserView.ID_BROWSER);
+ } else {
+ page.bringToTop(part);
+ }
+ String urlStr = getUrl(selection);
+ if (urlStr != null && !urlStr.equals("")) {
+ ((BrowserView) part).setUrl(urlStr);
+ }
+ } catch (Exception e) {
+ }
+ }
+ }
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ protected String findSelectedText() {
+ String selectedText = null;
+ ITextSelection textSelection = (ITextSelection) targetEditor.getEditorSite().getSelectionProvider().getSelection();
+
+ selectedText = textSelection.getText();
+ if (selectedText == null || selectedText.trim().length() == 0) {
+ selectedText = findWord(textSelection);
+ }
+ return selectedText;
+ }
+
+ private String findWord(ITextSelection textSelection) {
+ IDocumentProvider documentProvider = ((ITextEditor) targetEditor).getDocumentProvider();
+ IDocument document = documentProvider.getDocument(targetEditor.getEditorInput());
+ int caretPosition = textSelection.getOffset();
+ try {
+ IRegion line = document.getLineInformation(document.getLineOfOffset(caretPosition));
+ String currentLine = document.get(line.getOffset(), line.getLength());
+ int positionInLine = caretPosition - line.getOffset();
+ return findWordAt(positionInLine, currentLine);
+ } catch (Exception e) {
+ }
+ return null;
+ }
+
+ private String findWordAt(int pos, String source) {
+ BreakIterator boundary = BreakIterator.getWordInstance();
+ boundary.setText(source);
+ int end = boundary.following(pos);
+ int start = boundary.previous();
+ return source.substring(start, end);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions.httpquery;
+
+
+public class GoogleAction extends AbstractHTTPQueryAction {
+
+ public GoogleAction() {
+ super();
+ }
+
+ protected String getUrl(String selection) {
+ return "http://www.google.com/search?q=" + selection;
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions.httpquery;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.internal.ConfigurationManager;
+import net.sourceforge.phpeclipse.wiki.internal.IConfiguration;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.ui.dialogs.ListSelectionDialog;
+import org.eclipse.ui.internal.dialogs.ListContentProvider;
+
+public class HTTPQueryAction extends AbstractHTTPQueryAction {
+
+ public HTTPQueryAction() {
+ super();
+ }
+
+ protected String getUrl(String selection) {
+ String selectedURL = null;
+
+ List allConfigsList = ConfigurationManager.getInstance().getConfigurations();
+ ArrayList configsList = new ArrayList();
+ for (int i=0;i<allConfigsList.size();i++) {
+ IConfiguration temp = (IConfiguration)allConfigsList.get(i);
+ if (temp.getType().equals(WikiEditorPlugin.HTTP_QUERY)) {
+ configsList.add(temp);
+ }
+ }
+ Collections.sort(configsList);
+
+ ListSelectionDialog listSelectionDialog = new ListSelectionDialog(WikiEditorPlugin.getDefault().getWorkbench()
+ .getActiveWorkbenchWindow().getShell(), configsList, new ListContentProvider(), new LabelProvider(),
+ "Select URL");
+ listSelectionDialog.setTitle("Multiple configuration found");
+ if (listSelectionDialog.open() == Window.OK) {
+ Object[] configurations = listSelectionDialog.getResult();
+ if (configurations != null) {
+ for (int i = 0; i < configurations.length; i++) {
+ selectedURL = ((IConfiguration) configurations[i]).getURL();
+ break;
+ }
+ }
+ }
+ return selectedURL;
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions.httpquery;
+
+
+public class KodersAction extends AbstractHTTPQueryAction {
+
+ public KodersAction() {
+ super();
+ }
+
+ protected String getUrl(String selection) {
+ return "http://koders.com/?s=" + selection;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions.mediawiki;
+
+import java.io.ByteArrayInputStream;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditor;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceStatus;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+
+public final class DownloadWikiLinkEditorAction implements IEditorActionDelegate {
+
+ private IWorkbenchWindow window;
+
+ private AbstractTextEditor fEditor;
+
+ public void dispose() {
+ }
+
+ public void init(IWorkbenchWindow window) {
+ this.window = window;
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection.isEmpty()) {
+ return;
+ }
+ if (selection instanceof TextSelection) {
+ action.setEnabled(true);
+ return;
+ }
+ if (window.getActivePage() != null && window.getActivePage().getActivePart() != null) {
+ action.setEnabled(window.getActivePage().getActivePart().getClass().equals(WikiEditor.class));
+ }
+ }
+
+ public void run(IAction action) {
+ if (fEditor == null) {
+ IEditorPart targetEditor = window.getActivePage().getActiveEditor();
+ if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+ fEditor = (AbstractTextEditor) targetEditor;
+ }
+ }
+ if (fEditor != null) {
+ openWikiLinkOnSelection();
+ }
+ }
+
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+ fEditor = (AbstractTextEditor) targetEditor;
+ }
+ }
+
+ public static String getWikiString(AbstractTextEditor editor, IDocument document, int initialPos) {
+ try {
+ int pos = initialPos;
+ int line = document.getLineOfOffset(pos);
+ int start = document.getLineOffset(line);
+ int end = start + document.getLineInformation(line).getLength();
+
+ /*
+ * The line does not include \n or \r so pos can be > end. Making pos = end in this case is safe for the purposes of
+ * determining the TextRegion at the cursor position
+ */
+ if (pos > end) {
+ pos = end;
+ }
+
+ int offsetInLine = pos - start;
+ String word = document.get(start, end - start);
+ int wordlen = word.length();
+ int wikiLinkStart = -1;
+ int wikiLinkEnd = -1;
+
+ for (int i = offsetInLine; i < wordlen; i++) {
+ if (word.charAt(i) == ']' && i < wordlen - 1 && word.charAt(i + 1) == ']') {
+ wikiLinkEnd = i;
+ break;
+ }
+ if (word.charAt(i) == '|') {
+ wikiLinkEnd = i;
+ break;
+ }
+ if (word.charAt(i) == '#') {
+ wikiLinkEnd = i;
+ break;
+ }
+ }
+ for (int i = offsetInLine; i >= 0; i--) {
+ if (word.charAt(i) == '[' && i > 0 && word.charAt(i - 1) == '[') {
+ wikiLinkStart = i + 1;
+ break;
+ }
+ if (word.charAt(i) == '|') { // links wih different description
+ wikiLinkEnd = i;
+ }
+ if (word.charAt(i) == '#') { // for links with anchors
+ wikiLinkEnd = i;
+ }
+ }
+ if (wikiLinkStart != (-1) && wikiLinkEnd != (-1) && wikiLinkStart < wikiLinkEnd) {
+ return new String(word.toCharArray(), wikiLinkStart, wikiLinkEnd - wikiLinkStart);
+ }
+ } catch (BadLocationException e) {
+
+ }
+ return "";
+ }
+
+ public IDocument getDocument() {
+ IDocument doc = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
+ return doc;
+ }
+
+ public void openWikiLinkOnSelection() {
+ IDocument doc = getDocument();
+ ITextSelection selection = (ITextSelection) fEditor.getSelectionProvider().getSelection();
+ int pos = selection.getOffset();
+ String textRegion = getWikiString(fEditor, doc, pos);
+ IFileEditorInput ei = (IFileEditorInput) fEditor.getEditorInput();
+ openWikiFile(ei.getFile(), textRegion);
+ }
+
+ void openWikiFile(IFile cfile, String word) {
+ if (word != null && !word.equals("")) {
+ IFile file = getWikiFile(cfile, word);
+ try {
+ createNewFileIfNeeded(file, word);
+
+ // if (WikiEditorPlugin.getDefault().getPreferenceStore().getBoolean(WikiConstants.REUSE_EDITOR)) {
+ // saveIfNeeded();
+ // getActivePage().reuseEditor(reusableEditor, new FileEditorInput(file));
+ // } else {
+ IEditorPart part = IDE.openEditor(WikiEditorPlugin.getDefault().getActivePage(), file, true);
+ if (part != null && (part instanceof AbstractTextEditor)) {
+ AbstractTextEditor newEditor = (AbstractTextEditor) part;
+ word = word.replaceAll(" ", "_");
+ String wikiText = MediaWikiConnector.getWikiText(word, "http://en.wikibooks.org/w/wiki.phtml");
+ if (wikiText!=null) {
+ IDocument doc = newEditor.getDocumentProvider().getDocument(newEditor.getEditorInput());
+ doc.set(wikiText);
+ }
+ }
+
+
+ // redrawText();
+ // }
+ } catch (Exception e) {
+ // WikiEditorPlugin.getDefault().logAndReport(WikiEditorPlugin.getResourceString(WikiConstants.RESOURCE_WIKI_ERROR_DIALOGUE_OPEN_WIKI_FILE_TITLE),
+ // WikiPlugin.getResourceString(WikiConstants.RESOURCE_WIKI_ERROR_DIALOGUE_OPEN_WIKI_FILE_TEXT), e);
+ }
+ }
+ }
+
+ private void createNewFileIfNeeded(IFile file, String word) throws CoreException {
+ if (!file.exists()) {
+ createWikiFile(file, word);
+ }
+ }
+
+ private IFile getWikiFile(IFile file, String word) {
+ String wikiFileName = Util.getWikiFileName(word, file, WikiEditorPlugin.HTML_OUTPUT_PATH);
+ IPath path = new Path(wikiFileName);
+ return ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
+ }
+
+ /**
+ * Creates a folder resource handle for the folder with the given workspace path. This method does not create the folder resource;
+ * this is the responsibility of <code>createFolder</code>.
+ *
+ * @param folderPath
+ * the path of the folder resource to create a handle for
+ * @return the new folder resource handle
+ * @see #createFolder
+ */
+ private IFolder createFolderHandle(IPath folderPath) {
+ return IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getFolder(folderPath);
+ }
+
+ private void createFolder(IFolder folderHandle, IProgressMonitor monitor) throws CoreException {
+ try {
+ // Create the folder resource in the workspace
+ // Recursive to create any folders which do not exist already
+ if (!folderHandle.exists()) {
+ IContainer parent = folderHandle.getParent();
+ if (parent instanceof IFolder && (!((IFolder) parent).exists())) {
+ createFolder((IFolder) parent, monitor);
+ }
+ // if (linkTargetPath != null)
+ // folderHandle.createLink(linkTargetPath, IResource.ALLOW_MISSING_LOCAL, monitor);
+ // else
+ folderHandle.create(false, true, monitor);
+ }
+ } catch (CoreException e) {
+ // If the folder already existed locally, just refresh to get contents
+ if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED)
+ folderHandle.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 500));
+ else
+ throw e;
+ }
+ }
+
+ private void createWikiFile(IFile file, String word) throws CoreException {
+ IContainer parent = file.getParent();
+ if (parent instanceof IFolder && (!((IFolder) parent).exists())) {
+ createFolder((IFolder) parent, null);
+ }
+ String newText = "<!--" + word + "-->";
+ byte[] buffer = newText.getBytes();
+ ByteArrayInputStream source = new ByteArrayInputStream(buffer);
+ file.create(source, true, null);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions.mediawiki;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.StringReader;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.apache.commons.httpclient.ConnectMethod;
+import org.apache.commons.httpclient.HttpConnection;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.HttpState;
+import org.apache.commons.httpclient.HttpStatus;
+import org.apache.commons.httpclient.URI;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.methods.GetMethod;
+import org.apache.commons.httpclient.protocol.Protocol;
+
+/**
+ * This class gets the wikitext from a wikipedia edit page
+ *
+ * The basic coding was copied from the commons-httpclient example <code>MediaWikiConnector.java</code>
+ */
+public class MediaWikiConnector {
+
+ /**
+ * Get the text of a wikimedia Wiki-Description from <code>en.wikipedia.org</code>
+ *
+ */
+ public static String getWikiText(String wikiDescriptor) {
+ return getWikiText(wikiDescriptor, null);
+ }
+
+ /**
+ * Get the text of a wikimedia Wiki-Description
+ *
+ */
+ public static String getWikiText(String wikiDescriptor, String urlStr) {
+ // examples
+ // http://en.wikipedia.org/w/wiki.phtml?title=Main_Page&action=edit
+ // http://en.wikibooks.org/w/wiki.phtml?title=Programming:PHP:SQL_Injection&action=edit
+ // http://en.wikipedia.org/w/wiki.phtml?title=Talk:Division_by_zero&action=edit
+ HttpMethod method = null;
+ try {
+ if (urlStr == null) {
+ urlStr = "http://en.wikipedia.org/w/wiki.phtml?title=" + wikiDescriptor + "&action=edit";
+ } else {
+ urlStr = urlStr + "?title=" + wikiDescriptor + "&action=edit";
+ }
+ URI uri = new URI(urlStr.toCharArray());
+
+ String schema = uri.getScheme();
+ if ((schema == null) || (schema.equals(""))) {
+ schema = "http";
+ }
+ Protocol protocol = Protocol.getProtocol(schema);
+
+ HttpState state = new HttpState();
+
+ method = new GetMethod(uri.toString());
+ String host = uri.getHost();
+ int port = uri.getPort();
+
+ HttpConnection connection = new HttpConnection(host, port, protocol);
+
+ connection.setProxyHost(System.getProperty("http.proxyHost"));
+ connection.setProxyPort(Integer.parseInt(System.getProperty("http.proxyPort", "80")));
+
+ if (System.getProperty("http.proxyUserName") != null) {
+ state.setProxyCredentials(null, null, new UsernamePasswordCredentials(System.getProperty("http.proxyUserName"), System
+ .getProperty("http.proxyPassword")));
+ }
+
+ if (connection.isProxied() && connection.isSecure()) {
+ method = new ConnectMethod(method);
+ }
+
+ method.execute(state, connection);
+
+ if (method.getStatusCode() == HttpStatus.SC_OK) {
+ // get the textareas wiki text now:
+ InputStream stream = method.getResponseBodyAsStream();
+ int byteLen = stream.available();
+ int count = 1;
+ byte[] buffer = new byte[byteLen];
+ stream.read(buffer, 0, byteLen);
+ String wikiText = new String(buffer);
+// String wikiText = method.getResponseBodyAsString();
+ int start = wikiText.indexOf("<textarea");
+ if (start != (-1)) {
+ start = wikiText.indexOf(">", start + 1);
+ if (start != (-1)) {
+ int end = wikiText.indexOf("</textarea>");
+ wikiText = wikiText.substring(start + 1, end);
+ }
+ }
+ return wikiText;
+ // System.out.println(wikiText);
+
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (method != null) {
+ method.releaseConnection();
+ }
+ }
+ return null; // no success in getting wiki text
+ }
+}
+
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.actions.mediawiki;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditor;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceStatus;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.ui.IEditorActionDelegate;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.dialogs.ListSelectionDialog;
+import org.eclipse.ui.internal.dialogs.ListContentProvider;
+import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin;
+import org.eclipse.ui.texteditor.AbstractTextEditor;
+
+public final class RefreshWikiTextEditorAction implements IEditorActionDelegate {
+
+ private IWorkbenchWindow window;
+
+ private AbstractTextEditor fEditor;
+
+ public void dispose() {
+ }
+
+ public void init(IWorkbenchWindow window) {
+ this.window = window;
+ }
+
+ public void selectionChanged(IAction action, ISelection selection) {
+ if (selection.isEmpty()) {
+ return;
+ }
+ if (selection instanceof TextSelection) {
+ action.setEnabled(true);
+ return;
+ }
+ if (window.getActivePage() != null && window.getActivePage().getActivePart() != null) {
+ action.setEnabled(window.getActivePage().getActivePart().getClass().equals(WikiEditor.class));
+ }
+ }
+
+ public void run(IAction action) {
+ if (fEditor == null) {
+ IEditorPart targetEditor = window.getActivePage().getActiveEditor();
+ if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+ fEditor = (AbstractTextEditor) targetEditor;
+ }
+ }
+ if (fEditor != null) {
+ openWikiLinkOnSelection();
+ }
+ }
+
+ public void setActiveEditor(IAction action, IEditorPart targetEditor) {
+ if (targetEditor != null && (targetEditor instanceof AbstractTextEditor)) {
+ fEditor = (AbstractTextEditor) targetEditor;
+ }
+ }
+
+ public IDocument getDocument() {
+ IDocument doc = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
+ return doc;
+ }
+
+ public void openWikiLinkOnSelection() {
+ IDocument doc = getDocument();
+ ITextSelection selection = (ITextSelection) fEditor.getSelectionProvider().getSelection();
+ int pos = selection.getOffset();
+ // String textRegion = getWikiString(fEditor, doc, pos);
+ IFileEditorInput ei = (IFileEditorInput) fEditor.getEditorInput();
+ openWikiFile(ei.getFile());
+ }
+
+ void openWikiFile(IFile cfile) {
+ String wikiName = getWikiFile(cfile);
+ try {
+ if (fEditor != null) {
+ selectWiki(wikiName);
+ }
+ } catch (Exception e) {
+ }
+
+ }
+
+ private void selectWiki(String wikiName) {
+ String exampleWikiURL = "http://en.wikibooks.org/w/wiki.phtml";
+ String selectedWikiURL = null;
+ ArrayList locationsList = new ArrayList();
+ locationsList.add(exampleWikiURL);
+
+ Collections.sort(locationsList);
+
+ ListSelectionDialog listSelectionDialog = new ListSelectionDialog(WikiEditorPlugin.getDefault().getWorkbench()
+ .getActiveWorkbenchWindow().getShell(), locationsList, new ListContentProvider(), new LabelProvider(),
+ "Select the refresh URL.");
+ listSelectionDialog.setTitle("Multiple active configuration found");
+ if (listSelectionDialog.open() == Window.OK) {
+ Object[] locations = listSelectionDialog.getResult();
+ if (locations != null) {
+ for (int i = 0; i < locations.length; i++) {
+ selectedWikiURL = (String) locations[i];
+ break;
+ }
+ }
+ }
+
+ if (selectedWikiURL != null && !selectedWikiURL.equals("")) {
+ String wikiContent = MediaWikiConnector.getWikiText(wikiName, selectedWikiURL);
+ if (wikiContent != null) {
+ IDocument doc = fEditor.getDocumentProvider().getDocument(fEditor.getEditorInput());
+ doc.set(wikiContent);
+ }
+ }
+ }
+
+ private void createNewFileIfNeeded(IFile file, String word) throws CoreException {
+ if (!file.exists()) {
+ createWikiFile(file, word);
+ }
+ }
+
+ private String getWikiFile(IFile file) {
+ return Util.getFileWikiName(file, WikiEditorPlugin.HTML_OUTPUT_PATH);
+ // IPath path = new Path(wikiFileName);
+ // return ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(path);
+ }
+
+ /**
+ * Creates a folder resource handle for the folder with the given workspace path. This method does not create the folder resource;
+ * this is the responsibility of <code>createFolder</code>.
+ *
+ * @param folderPath
+ * the path of the folder resource to create a handle for
+ * @return the new folder resource handle
+ * @see #createFolder
+ */
+ private IFolder createFolderHandle(IPath folderPath) {
+ return IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getFolder(folderPath);
+ }
+
+ private void createFolder(IFolder folderHandle, IProgressMonitor monitor) throws CoreException {
+ try {
+ // Create the folder resource in the workspace
+ // Recursive to create any folders which do not exist already
+ if (!folderHandle.exists()) {
+ IContainer parent = folderHandle.getParent();
+ if (parent instanceof IFolder && (!((IFolder) parent).exists())) {
+ createFolder((IFolder) parent, monitor);
+ }
+ // if (linkTargetPath != null)
+ // folderHandle.createLink(linkTargetPath, IResource.ALLOW_MISSING_LOCAL, monitor);
+ // else
+ folderHandle.create(false, true, monitor);
+ }
+ } catch (CoreException e) {
+ // If the folder already existed locally, just refresh to get contents
+ if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED)
+ folderHandle.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 500));
+ else
+ throw e;
+ }
+ }
+
+ private void createWikiFile(IFile file, String word) throws CoreException {
+ IContainer parent = file.getParent();
+ if (parent instanceof IFolder && (!((IFolder) parent).exists())) {
+ createFolder((IFolder) parent, null);
+ }
+ String newText = "<!--" + word + "-->";
+ byte[] buffer = newText.getBytes();
+ ByteArrayInputStream source = new ByteArrayInputStream(buffer);
+ file.create(source, true, null);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+/*\r
+** Mediawiki 'monobook' style sheet for CSS2-capable browsers.\r
+** Copyright Gabriel Wicke - http://wikidev.net/\r
+** License: GPL\r
+**\r
+** Loosely based on http://www.positioniseverything.net/ordered-floats.html by Big John\r
+** and the Plone 2.0 styles, see http://plone.org/ (Alexander Limi,Joe Geldart & Tom Croucher,\r
+** Michael Zeltner and Geir Bækholt)\r
+** All you guys rock :)\r
+*/\r
+\r
+#column-content {\r
+ width: 100%;\r
+ float: right;\r
+ margin: 0 0 0.6em -12.2em;\r
+ padding:0;\r
+}\r
+#content {\r
+ margin: 2.8em 0 0 12.2em;\r
+ padding: 0em 1em 1.5em 1em;\r
+ background: White;\r
+ border: 1px solid #aaaaaa;\r
+ border-right: none;\r
+ line-height: 1.5em;\r
+ position: relative;\r
+ z-index: 2;\r
+}\r
+#column-one { padding-top: 160px; }\r
+/* the left column width is specified in class .portlet */\r
+\r
+/* Font size:\r
+** We take advantage of keyword scaling- browsers won't go below 9px\r
+** More at http://www.w3.org/2003/07/30-font-size\r
+** http://style.cleverchimp.com/font_size_intervals/altintervals.html\r
+*/\r
+\r
+body {\r
+ font: x-small sans-serif;\r
+ background: #f9f9f9 url("headbg.jpg") 0px 0px no-repeat;\r
+ color: Black;\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+/* scale back up to a sane default */\r
+#globalWrapper {\r
+ font-size:127%;\r
+ width: 100%;\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+.visualClear { clear: both; }\r
+\r
+/* general styles */\r
+\r
+table {\r
+ font-size: 100%;\r
+ background: White;\r
+}\r
+a {\r
+ text-decoration: none;\r
+ color: #002bb8;\r
+ background: none;\r
+}\r
+a:visited { color: #5a3696; }\r
+a:active { color: Orange; }\r
+a:hover { text-decoration: underline; }\r
+a.stub { color: #772233; }\r
+a.new,\r
+#p-personal a.new { color:#ba0000; }\r
+a.new:visited,\r
+#p-personal a.new:visited { color:#a55858; }\r
+\r
+img {\r
+ border: none;\r
+ vertical-align: middle;\r
+}\r
+p {\r
+ margin: 0.4em 0em 0.5em 0em;\r
+ line-height: 1.5em;\r
+}\r
+\r
+p img { margin: 0; }\r
+\r
+hr {\r
+ height: 1px;\r
+ color: #aaaaaa;\r
+ background-color: #aaaaaa;\r
+ border: 0;\r
+ margin: 0.2em 0 0.2em 0;\r
+}\r
+\r
+h1, h2, h3, h4, h5, h6 {\r
+ color: Black;\r
+ background: none;\r
+ font-weight: normal;\r
+ margin: 0;\r
+ padding-top: 0.5em;\r
+ padding-bottom: 0.17em;\r
+ border-bottom: 1px solid #aaaaaa;\r
+}\r
+h1 { font-size: 188%; }\r
+h2 { font-size: 150%; }\r
+h3, h4, h5, h6 { \r
+ border-bottom: none;\r
+ font-weight: bold;\r
+}\r
+h3 { font-size: 132%; }\r
+h4 { font-size: 116%; }\r
+h5 { font-size: 100%; }\r
+h6 { font-size: 80%; }\r
+\r
+ul { \r
+ line-height: 1.5em;\r
+ list-style-type: square;\r
+ margin: 0.3em 0 0 1.5em;\r
+ padding:0;\r
+ list-style-image: url("bullet.gif");\r
+}\r
+ol {\r
+ line-height: 1.5em;\r
+ margin: 0.3em 0 0 3.2em;\r
+ padding:0;\r
+ list-style-image: none;\r
+}\r
+li { margin-bottom: 0.1em; }\r
+dt { \r
+ font-weight: bold; \r
+ margin-bottom: 0.1em;\r
+}\r
+dl{\r
+ margin-top: 0.2em;\r
+ margin-bottom: 0.5em;\r
+}\r
+dd {\r
+ line-height: 1.5em;\r
+ margin-left: 2em;\r
+ margin-bottom: 0.1em;\r
+}\r
+\r
+fieldset {\r
+ border: 1px solid #2f6fab;\r
+ margin: 1em 0em 1em 0em;\r
+ padding: 0em 1em 1em 1em;\r
+ line-height: 1.5em;\r
+}\r
+legend {\r
+ background: White;\r
+ padding: 0.5em;\r
+ font-size: 95%;\r
+}\r
+form {\r
+ border: none;\r
+ margin: 0;\r
+}\r
+\r
+textarea {\r
+ border: 1px solid #2f6fab; \r
+ color: Black;\r
+ background-color: white;\r
+ width: 100%;\r
+ padding: 0.1em;\r
+ overflow: auto;\r
+}\r
+/* hide this from ie/mac and konq2.2 */\r
+@media All {\r
+ head:first-child+body input {\r
+ visibility: visible;\r
+ border: 1px solid #2f6fab; \r
+ color: Black;\r
+ background-color: white;\r
+ vertical-align: middle;\r
+ padding: 0.2em;\r
+ }\r
+}\r
+input.historysubmit {\r
+ padding: 0 0.3em 0.3em 0.3em !important;\r
+ font-size: 94%;\r
+ cursor: pointer;\r
+ height: 1.7em !important;\r
+ margin-left: 1.6em;\r
+}\r
+input[type="radio"],\r
+input[type="checkbox"] { border:none; }\r
+select {\r
+ border: 1px solid #2f6fab; \r
+ color: Black;\r
+ vertical-align: top;\r
+}\r
+abbr, acronym, .explain {\r
+ border-bottom: 1px dotted Black;\r
+ color: Black;\r
+ background: none;\r
+ cursor: help;\r
+}\r
+q {\r
+ font-family: Times, "Times New Roman", serif;\r
+ font-style: italic;\r
+}\r
+/* disabled for now\r
+blockquote {\r
+ font-family: Times, "Times New Roman", serif;\r
+ font-style: italic;\r
+}*/\r
+code { background-color: #f9f9f9; }\r
+pre {\r
+ padding: 1em;\r
+ border: 1px dashed #2f6fab;\r
+ color: Black;\r
+ background-color: #f9f9f9;\r
+ line-height: 1.1em;\r
+}\r
+\r
+\r
+/*\r
+** the main content area\r
+*/\r
+\r
+#siteSub { display: none; }\r
+#contentSub {\r
+ font-size: 84%;\r
+ line-height: 1.2em;\r
+ margin: 0 0 1.4em 1em;\r
+ color: #7d7d7d;\r
+ width: auto;\r
+}\r
+span.subpages { display: block; }\r
+\r
+/* Some space under the headers in the content area */\r
+#bodyContent h1, #bodyContent h2 { margin-bottom:0.6em; }\r
+#bodyContent h3,\r
+#bodyContent h4,\r
+#bodyContent h5 {\r
+ margin-bottom: 0.3em;\r
+}\r
+.firstHeading { margin-bottom:0.1em; }\r
+\r
+/* user notification thing */\r
+.usermessage {\r
+ background-color: #ffce7b;\r
+ border: 1px solid #ffa500;\r
+ color: Black;\r
+ font-weight: bold;\r
+ margin: 2em 0em 1em 0em;\r
+ padding: 0.5em 1em;\r
+ vertical-align: middle;\r
+}\r
+#siteNotice {\r
+ text-align: center;\r
+ font-size: 95%;\r
+ padding: 0 0.9em 0 0.9em;\r
+}\r
+#siteNotice p { margin: none; padding: none; }\r
+.error {\r
+ color: red;\r
+ font-size: larger;\r
+}\r
+#catlinks {\r
+ border:1px solid #aaaaaa;\r
+ background-color:#f9f9f9;\r
+ padding:5px;\r
+ margin-top: 1em;\r
+ clear: both;\r
+}\r
+/* currently unused, intended to be used by a metadata box\r
+in the bottom-right corner of the content area */\r
+.documentDescription {\r
+ /* The summary text describing the document */\r
+ font-weight: bold;\r
+ display: block;\r
+ margin: 1em 0em;\r
+ line-height: 1.5em;\r
+}\r
+.documentByLine {\r
+ text-align: right;\r
+ font-size: 90%;\r
+ clear: both;\r
+ font-weight: normal;\r
+ color: #76797c;\r
+}\r
+\r
+/* emulate center */\r
+.center {\r
+ width: 100%;\r
+ text-align: center;\r
+}\r
+*.center * {\r
+ margin-left: auto;\r
+ margin-right: auto;\r
+}\r
+/* small for tables and similar */\r
+.small, .small * { font-size: 94%; }\r
+table.small { font-size: 100% }\r
+\r
+/*\r
+** content styles\r
+*/\r
+\r
+#toc { \r
+ /*border:1px solid #2f6fab;*/\r
+ border:1px solid #aaaaaa;\r
+ background-color:#f9f9f9;\r
+ padding:5px;\r
+ font-size: 95%;\r
+}\r
+#toc .tocindent { margin-left: 2em; }\r
+#toc .tocline { margin-bottom: 0px; }\r
+#toc p { margin: 0 }\r
+#toc .toctoggle { font-size: 94%; }\r
+#toc .editsection { \r
+ margin-top: 0.7em; \r
+ font-size: 94%;\r
+}\r
+\r
+/* images */\r
+div.floatright, table.floatright {\r
+ clear: right;\r
+ float: right; \r
+ margin: 0;\r
+ position: relative;\r
+ border: 0.5em solid White;\r
+ border-width: 0.5em 0 0.8em 1.4em;\r
+}\r
+div.floatright p { font-style: italic; } \r
+div.floatleft, table.floatleft {\r
+ float: left; \r
+ margin: 0.3em 0.5em 0.5em 0;\r
+ position: relative;\r
+ border: 0.5em solid White;\r
+ border-width: 0.5em 1.4em 0.8em 0;\r
+}\r
+div.floatleft p { font-style: italic; } \r
+/* thumbnails */\r
+div.thumb {\r
+ margin-bottom: 0.5em;\r
+ border-style: solid; border-color: White;\r
+ width: auto;\r
+}\r
+div.thumb div {\r
+ border:1px solid #cccccc;\r
+ padding: 3px !important;\r
+ background-color:#f9f9f9;\r
+ font-size: 94%;\r
+ text-align: center;\r
+ overflow: hidden;\r
+}\r
+div.thumb div a img {\r
+ border:1px solid #cccccc;\r
+}\r
+div.thumb div div.thumbcaption {\r
+ border: none;\r
+ text-align: left;\r
+ line-height: 1.4;\r
+ padding: 0.3em 0 0.1em 0;\r
+}\r
+div.magnify {\r
+ float: right;\r
+ border: none !important;\r
+ background: none !important;\r
+}\r
+div.magnify a, div.magnify img {\r
+ display: block;\r
+ border: none !important;\r
+ background: none !important;\r
+}\r
+div.tright {\r
+ clear: right;\r
+ float: right;\r
+ border-width: 0.5em 0 0.8em 1.4em;\r
+}\r
+div.tleft {\r
+ float: left;\r
+ margin-right:0.5em;\r
+ border-width: 0.5em 1.4em 0.8em 0;\r
+}\r
+.urlexpansion,\r
+.hiddenStructure {\r
+ display: none;\r
+}\r
+img.tex { vertical-align: middle; }\r
+span.texhtml { font-family: serif; }\r
+\r
+/*\r
+** classes for special content elements like town boxes\r
+** intended to be referenced directly from the wiki src\r
+*/\r
+\r
+/*\r
+** User styles\r
+*/\r
+/* table standards */\r
+table.rimage {\r
+ float:right; \r
+ position:relative;\r
+ margin-left:1em; \r
+ margin-bottom:1em;\r
+ text-align:center;\r
+}\r
+.toccolours { \r
+ border:1px solid #aaaaaa;\r
+ background-color:#f9f9f9;\r
+ padding:5px;\r
+ font-size: 95%;\r
+}\r
+div.townBox {\r
+ position:relative;\r
+ float:right;\r
+ background:White;\r
+ margin-left:1em;\r
+ border: 1px solid Grey;\r
+ padding:0.3em;\r
+ width: 200px;\r
+ overflow: hidden;\r
+ clear: right;\r
+}\r
+div.townBox dl {\r
+ padding: 0;\r
+ margin: 0 0 0.3em 0; \r
+ font-size: 96%;\r
+}\r
+div.townBox dl dt {\r
+ background: none;\r
+ margin: 0.4em 0 0 0;\r
+}\r
+div.townBox dl dd {\r
+ margin: 0.1em 0 0 1.1em;\r
+ background-color: #f3f3f3;\r
+}\r
+\r
+/*\r
+** edit views etc\r
+*/\r
+.special li {\r
+ line-height: 1.4em;\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+\r
+/* Page history styling */\r
+/* the auto-generated edit comments */\r
+.autocomment { color: gray; }\r
+#pagehistory span.user { \r
+ margin-left: 1.4em;\r
+ margin-right: 0.4em;\r
+}\r
+#pagehistory span.minor { font-weight: bold; }\r
+#pagehistory li { border: 1px solid White; }\r
+#pagehistory li.selected { \r
+ background-color:#f9f9f9;\r
+ border:1px dashed #aaaaaa;\r
+}\r
+/*\r
+** Diff rendering\r
+*/\r
+table.diff { background:white; }\r
+td.diff-otitle { background:#ffffff; }\r
+td.diff-ntitle { background:#ffffff; }\r
+td.diff-addedline { \r
+ background:#ccffcc;\r
+ font-size: smaller;\r
+}\r
+td.diff-deletedline { \r
+ background:#ffffaa;\r
+ font-size: smaller;\r
+}\r
+td.diff-context {\r
+ background:#eeeeee;\r
+ font-size: smaller;\r
+}\r
+span.diffchange { color: red; }\r
+\r
+/* \r
+** keep the whitespace in front of the ^=, hides rule from konqueror\r
+** this is css3, the validator doesn't like it when validating as css2 \r
+*/\r
+#bodyContent a[href ^="http://"],\r
+#bodyContent a[href ^="gopher://"] {\r
+ background: url(external.png) center right no-repeat;\r
+ padding-right: 13px;\r
+}\r
+#bodyContent a[href ^="https://"],\r
+.link-https {\r
+ background: url("lock_icon.gif") center right no-repeat;\r
+ padding-right: 16px;\r
+}\r
+#bodyContent a[href ^="mailto:"],\r
+.link-mailto {\r
+ background: url("mail_icon.gif") center right no-repeat;\r
+ padding-right: 18px;\r
+}\r
+#bodyContent a[href ^="news://"] {\r
+ background: url("news_icon.png") center right no-repeat;\r
+ padding-right: 18px;\r
+}\r
+#bodyContent a[href ^="ftp://"],\r
+.link-ftp {\r
+ background: url("file_icon.gif") center right no-repeat;\r
+ padding-right: 18px;\r
+}\r
+#bodyContent a[href ^="irc://"],\r
+.link-irc {\r
+ background: url("discussionitem_icon.gif") center right no-repeat;\r
+ padding-right: 18px;\r
+}\r
+/* disable interwiki styling */\r
+#bodyContent a.extiw,\r
+#bodyContent a.extiw:active {\r
+ color: #3366bb;\r
+ background: none;\r
+ padding: 0;\r
+}\r
+#bodyContent a.external { color: #3366bb; }\r
+/* this can be used in the content area to switch off\r
+special external link styling */\r
+#bodyContent .plainlinks a {\r
+ background: none !important;\r
+ padding: 0;\r
+}\r
+/*\r
+** Structural Elements\r
+*/\r
+\r
+/*\r
+** general portlet styles (elements in the quickbar)\r
+*/\r
+.portlet {\r
+ border: none;\r
+ margin: 0 0 0.5em 0em;\r
+ float: none;\r
+ padding: 0;\r
+ width: 11.6em;\r
+ overflow: hidden;\r
+}\r
+.portlet h4 {\r
+ font-size: 95%;\r
+ font-weight: normal;\r
+ white-space: nowrap;\r
+}\r
+.portlet h5 { \r
+ background: transparent;\r
+ padding: 0em 1em 0em 0.5em;\r
+ text-transform: lowercase;\r
+ display: inline;\r
+ font-size: 91%;\r
+ height: 1em;\r
+ font-weight: normal;\r
+ white-space: nowrap;\r
+}\r
+.portlet h6 { \r
+ background: #ffae2e;\r
+ border: 1px solid #2f6fab;\r
+ border-style: solid solid none solid;\r
+ padding: 0em 1em 0em 1em;\r
+ text-transform: lowercase;\r
+ display: block;\r
+ font-size: 1em;\r
+ height: 1.2em;\r
+ font-weight: normal;\r
+ white-space: nowrap;\r
+}\r
+.pBody {\r
+ font-size: 95%;\r
+ background: White;\r
+ border-collapse: collapse;\r
+ border: 1px solid #aaaaaa;\r
+ padding: 0 0.8em 0.3em 0.5em;\r
+}\r
+.portlet h1, \r
+.portlet h2, \r
+.portlet h3, \r
+.portlet h4 {\r
+ margin: 0;\r
+ padding: 0;\r
+}\r
+.portlet ul {\r
+ line-height: 1.5em;\r
+ list-style-type: square;\r
+ list-style-image: url("bullet.gif");\r
+ font-size:95%;\r
+}\r
+.portlet li {\r
+ padding:0;\r
+ margin: 0 0 0 0;\r
+ margin-bottom: 0;\r
+}\r
+\r
+/* \r
+** Logo properties \r
+*/\r
+\r
+#p-logo {\r
+ z-index: 3;\r
+ position:absolute; /*needed to use z-index */\r
+ top: 0;\r
+ left: 0;\r
+ height: 155px;\r
+ width: 12em;\r
+ overflow: visible;\r
+}\r
+#p-logo h5 { display: none; }\r
+#p-logo a,\r
+#p-logo a:hover {\r
+ display: block;\r
+ height: 155px;\r
+ width: 12.2em;\r
+ background-repeat: no-repeat;\r
+ background-position: 35% 50% !important;\r
+ text-decoration: none;\r
+}\r
+\r
+/*\r
+** the navigation portlet\r
+*/\r
+\r
+#p-nav {\r
+ position:relative;\r
+ z-index:3;\r
+}\r
+\r
+/*\r
+** Search portlet\r
+*/\r
+#p-search {\r
+ position:relative;\r
+ z-index:3;\r
+} \r
+#p-search .pBody {\r
+ text-align: center;\r
+}\r
+input.searchButton {\r
+ margin-top:1px;\r
+ padding: 0 0.4em !important;\r
+ font-size: 95%;\r
+ cursor: pointer;\r
+ background-color: White;\r
+ border: 1px solid #2f6fab; \r
+}\r
+#searchInput {\r
+ border: 1px solid #2f6fab; \r
+ width:10.9em;\r
+ margin: 0 0 0 0;\r
+ font-size: 95%;\r
+}\r
+#p-search .pBody {\r
+ padding: 0.5em 0.4em 0.4em 0.4em;\r
+}\r
+\r
+/* \r
+** the personal toolbar\r
+*/\r
+\r
+#p-personal {\r
+ width:100%;\r
+ white-space:nowrap;\r
+ padding:0 0 0 0;\r
+ margin:0;\r
+ position:absolute;\r
+ left:0px;\r
+ top:0px;\r
+ z-index: 0;\r
+ border: none;\r
+ background: none;\r
+ overflow: visible;\r
+ line-height: 1.2em;\r
+}\r
+\r
+#p-personal h5 {\r
+ display:none;\r
+}\r
+#p-personal .portlet,\r
+#p-personal .pBody {\r
+ padding:0;\r
+ margin:0;\r
+ border: none;\r
+ z-index:0;\r
+ overflow: visible;\r
+ background: none;\r
+}\r
+/* this is the ul contained in the portlet */\r
+#p-personal ul {\r
+ border: none;\r
+ line-height: 1.4em;\r
+ color: #2f6fab;\r
+ padding: 0em 2em 0 3em;\r
+ margin: 0;\r
+ text-align: right;\r
+ text-transform: lowercase;\r
+ list-style: none;\r
+ z-index:0;\r
+ background: none;\r
+}\r
+#p-personal li {\r
+ z-index:0;\r
+ border:none;\r
+ padding:0;\r
+ display: inline;\r
+ color: #2f6fab;\r
+ margin-left: 1em;\r
+ line-height: 1.2em;\r
+ background: none;\r
+}\r
+#p-personal li a {\r
+ text-decoration: none;\r
+ color: #005896;\r
+ padding-bottom: 0.2em;\r
+ background: none;\r
+}\r
+#p-personal li a:hover {\r
+ background-color: White;\r
+ padding-bottom: 0.2em;\r
+ text-decoration: none;\r
+}\r
+\r
+/* the icon in front of the user name, single quotes\r
+in bg url to hide it from iemac */\r
+li#pt-userpage,\r
+li#pt-anonuserpage,\r
+li#pt-login {\r
+ background: url('user.gif') top left no-repeat;\r
+ background-repeat: no-repeat;\r
+ padding-left: 20px;\r
+ text-transform: none;\r
+}\r
+\r
+/*\r
+** the page-related actions- page/talk, edit etc \r
+*/\r
+#p-cactions {\r
+ position:absolute;\r
+ top: 1.3em;\r
+ left: 11.5em;\r
+ margin: 0;\r
+ white-space:nowrap;\r
+ width: 76%;\r
+ line-height: 1.1em;\r
+ overflow: visible;\r
+ background: none;\r
+ border-collapse: collapse;\r
+ padding-left: 1em;\r
+ list-style: none;\r
+ font-size: 95%;\r
+}\r
+#p-cactions .hiddenStructure { display: none; }\r
+#p-cactions ul {\r
+ list-style: none;\r
+}\r
+#p-cactions li {\r
+ display: inline;\r
+ border: 1px solid #aaaaaa;\r
+ border-bottom: none;\r
+ padding: 0 0 0.1em 0;\r
+ margin: 0 0.3em 0 0;\r
+ overflow: visible;\r
+ background: White;\r
+}\r
+#p-cactions li.selected {\r
+ border-color: #fabd23;\r
+ padding: 0 0 0.2em 0;\r
+}\r
+#p-cactions li a {\r
+ background-color: White;\r
+ color: #002bb8;\r
+ border: none;\r
+ padding: 0 0.8em 0.3em 0.8em;\r
+ text-decoration: none;\r
+ text-transform: lowercase;\r
+ position: relative;\r
+ z-index: 0;\r
+ margin: 0;\r
+}\r
+#p-cactions .selected a { z-index: 3; }\r
+#p-cactions .new a { color:#ba0000; }\r
+#p-cactions li a:hover {\r
+ z-index: 3;\r
+ text-decoration: none;\r
+}\r
+#p-cactions h5 { display: none; }\r
+#p-cactions li.istalk { margin-right: 0; }\r
+#p-cactions li.istalk a { padding-right: 0.5em; }\r
+#p-cactions #ca-addsection a { \r
+ padding-left: 0.4em;\r
+ padding-right: 0.4em;\r
+}\r
+/* offsets to distinguish the tab groups */\r
+li#ca-talk { margin-right: 1.6em; }\r
+li#ca-watch, li#ca-watch { margin-left: 1.6em; }\r
+\r
+\r
+/*\r
+** the remaining portlets\r
+*/\r
+#p-tbx,\r
+#p-lang {\r
+ position:relative;\r
+ z-index:3;\r
+}\r
+\r
+/*\r
+** footer\r
+*/\r
+#footer {\r
+ background-color: White;\r
+ border-top: 1px solid #fabd23;\r
+ border-bottom: 1px solid #fabd23;\r
+ margin: 0.6em 0em 1em 0em;\r
+ padding: 0.4em 0em 1.2em 0em;\r
+ text-align: center;\r
+ font-size: 90%;\r
+}\r
+#footer li {\r
+ display: inline;\r
+ margin: 0 1.3em;\r
+}\r
+/* hide from incapable browsers */\r
+head:first-child+body #footer li { white-space: nowrap; }\r
+#f-poweredbyico, #f-copyrightico {\r
+ margin: 0 8px;\r
+ position: relative;\r
+ top: -2px; /* Bump it up just a tad */\r
+}\r
+#f-poweredbyico {\r
+ float: right;\r
+ height: 1%;\r
+}\r
+#f-copyrightico {\r
+ float: left;\r
+ height: 1%;\r
+}\r
+\r
+/* js pref toc */\r
+#preftoc { \r
+ float: left;\r
+ margin: 1em 1em 1em 1em;\r
+ width: 13em;\r
+}\r
+#preftoc li { border: 1px solid White; }\r
+#preftoc li.selected { \r
+ background-color:#f9f9f9;\r
+ border:1px dashed #aaaaaa;\r
+}\r
+#preftoc a,\r
+#preftoc a:active {\r
+ display: block;\r
+ color: #0014a6;\r
+}\r
+#prefcontrol { \r
+ clear: both;\r
+ float: left;\r
+ margin-top: 1em;\r
+}\r
+div.prefsectiontip { \r
+ font-size: 95%;\r
+ margin-top: 1em;\r
+}\r
+fieldset.operaprefsection { margin-left: 15em }\r
+\r
+/* \r
+** IE/Mac fixes, hope to find a validating way to move this\r
+** to a separate stylesheet. This would work but doesn't validate: \r
+** @import("IEMacFixes.css");\r
+*/\r
+/* tabs: border on the a, not the div */\r
+* > html #p-cactions li { border:none; }\r
+* > html #p-cactions li a {\r
+ border: 1px solid #aaaaaa;\r
+ border-bottom: none;\r
+}\r
+* > html #p-cactions li.selected a { border-color: #fabd23; }\r
+/* footer icons need a fixed width */\r
+* > html #f-poweredbyico,\r
+* > html #f-copyrightico { width: 88px; }\r
+* > html #bodyContent,\r
+* > html #bodyContent pre {\r
+ overflow-x: auto;\r
+ width: 100%;\r
+ padding-bottom: 25px;\r
+}\r
+\r
+/* more IE fixes */\r
+/* float/negative margin brokenness */\r
+* html #footer {margin-top: 0;}\r
+* html #column-content {\r
+ display: inline;\r
+ margin-bottom: 0;\r
+}\r
+* html div.editsection { font-size: smaller; }\r
+#pagehistory li.selected { position: relative; }\r
+\r
+/* Mac IE 5.0 fix; floated content turns invisible */\r
+* > html #column-content {\r
+ float: none;\r
+}\r
+* > html #column-one {\r
+ position: absolute;\r
+ left: 0;\r
+ top: 0;\r
+}\r
+* > html #footer {\r
+ margin-left: 13.2em;\r
+}\r
+\r
+.printfooter {\r
+ display: none;\r
+}\r
+\r
+.sharedUploadNotice {\r
+ font-style: italic;\r
+}
\ No newline at end of file
--- /dev/null
+
+package net.sourceforge.phpeclipse.wiki.blog;
+
+public class BlogEntry {
+ String fGuid;
+ long fDate;
+ public BlogEntry(String guid, long date) {
+ fGuid = guid;
+ fDate = date;
+ }
+ public String getGuid() {
+ return fGuid;
+ }
+ public long getTime() {
+ return fDate;
+ }
+}
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.blog;
+
+import net.sourceforge.phpeclipse.wiki.preferences.AlternateUserValidationDialog;
+import net.sourceforge.phpeclipse.wiki.preferences.UserValidationDialog;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.widgets.Shell;
+
+public class Configuration {
+ String fUrl;
+
+ String fBlogID;
+
+ String fUser;
+
+ String fPassword;
+
+ public Configuration(String url, String blogId, String user, String password) {
+ fUrl = url;
+ fBlogID = blogId;
+ fUser = user;
+ fPassword = password;
+ }
+
+ /**
+ * @return Returns the blogID.
+ */
+ public String getBlogID() {
+ return fBlogID;
+ }
+
+ /**
+ * @param blogID
+ * The blogID to set.
+ */
+ public void setBlogID(String blogID) {
+ fBlogID = blogID;
+ }
+
+ /**
+ * @return Returns the fPassword.
+ */
+ public String getPassword() {
+ return fPassword;
+ }
+
+ /**
+ * @param fPassword
+ * The fPassword to set.
+ */
+ public void setPassword(String password) {
+ fPassword = password;
+ }
+
+ /**
+ * @return Returns the url.
+ */
+ public String getUrl() {
+ return fUrl;
+ }
+
+ /**
+ * @param url
+ * The url to set.
+ */
+ public void setUrl(String url) {
+ fUrl = url;
+ }
+
+ /**
+ * @return Returns the fUser.
+ */
+ public String getUser() {
+ return fUser;
+ }
+
+ /**
+ * @param fUser
+ * The fUser to set.
+ */
+ public void setUser(String user) {
+ fUser = user;
+ }
+
+ public boolean isUserComplete() {
+ if (fUser==null || fUser.equals("")) {
+ return false;
+ }
+ if (fPassword==null || fPassword.equals("")) {
+ return false;
+ }
+ return true;
+ }
+ /**
+ * Special alternate prompting. Returns the fPassword. Username must be fixed.
+ *
+ *
+ * String passWord = Configuration.alternatePromptForPassword(config.getUser());
+ * if (passWord==null||passWord.equals("")) {
+ * return;
+ * }
+ * config.setPassword(passWord);
+ */
+ public String alternatePromptForPassword(final String username) {
+ Shell shell = Util.findShell();
+ AlternateUserValidationDialog dialog = new AlternateUserValidationDialog(shell, (username == null) ? "" : username); //$NON-NLS-1$
+ dialog.setUsername(username);
+ int result = dialog.open();
+ if (result == Dialog.CANCEL)
+ return null;
+ return dialog.getPassword();
+ }
+
+ /**
+ * Asks the User to enter a Password. Places the results in the supplied string[]. result[0] must contain the username, result[1]
+ * must contain the fPassword. If the fUser canceled, both values must be zero.
+ *
+ * @param location
+ * the location to obtain the fPassword for
+ * @param username
+ * the username
+ * @param message
+ * a message to display to the fUser
+ * @param userMutable
+ * whether the fUser can be changed in the dialog
+ * @param result
+ * a String array of length two in which to put the result
+ */
+ public boolean promptForPassword(final String username, final String message, final boolean userMutable, final String[] result) {
+ if (isUserComplete()) {
+ result[0] = fUser;
+ result[1] = fPassword;
+ return false;
+ }
+ Shell shell = Util.findShell();
+ if (shell == null) {
+ return false;
+ }
+ String domain = "<test>"; //location == null ? null : location.getLocation();
+ UserValidationDialog dialog = new UserValidationDialog(shell, domain, (username == null) ? "" : username, message);//$NON-NLS-1$
+ dialog.setUsernameMutable(userMutable);
+ dialog.open();
+ result[0] = dialog.getUsername();
+ result[1] = dialog.getPassword();
+ return dialog.getAllowCaching();
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.blog;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.util.Date;
+import java.util.Hashtable;
+import java.util.Vector;
+
+import org.apache.xmlrpc.XmlRpcClient;
+import org.apache.xmlrpc.XmlRpcException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.dialogs.MessageDialog;
+
+public class MetaWeblog {
+
+ XmlRpcClient xmlrpc;
+
+ Configuration config;
+
+ public MetaWeblog(Configuration conf) throws MalformedURLException {
+ config = conf;
+ xmlrpc = new XmlRpcClient(config.getUrl());
+ }
+
+ public String newPost(Configuration config, IFile file, String title, StringBuffer htmlBuffer) {
+ return newPost(config, file, title, htmlBuffer);
+ }
+
+ public String newPost(IFile file, String title, StringBuffer htmlBuffer, boolean publish) {
+ try {
+ // XmlRpcClient xmlrpc = new XmlRpcClient(config.getUrl());
+
+ Hashtable message = new Hashtable();
+ message.put("title", "title");
+ message.put("description", htmlBuffer.toString());
+
+ Vector params = new Vector();
+ String guid = null;
+
+ params.add(config.getBlogID());
+ params.add(config.getUser());
+ params.add(config.getPassword());
+ params.add(message);
+ if (publish) {
+ params.add(Boolean.TRUE); //publish=true
+ } else {
+ params.add(Boolean.FALSE); //publish=false
+ }
+ return (String) xmlrpc.execute("metaWeblog.newPost", params);
+ } catch (MalformedURLException e) {
+ MessageDialog.openError(null, "MalformedURLException: ", e.toString());
+ } catch (Exception e) {
+ MessageDialog.openError(null, "Exception: ", e.toString());
+ // e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * Publish (or delete) the attachement.
+ *
+ * @param snipId
+ * the id of the snip to which the attachment belongs
+ * @param attachementFilename
+ * The blog attachement. If the publication is successful this will be updated to contain a reference to the publication
+ * location.
+ * @param delete
+ * true if the attachment is in fact to be deleted
+ * @return the attachment info
+ * @throws TransferFilesException
+ */
+ public void publishAttachement(String snipId, String attachementFilename, boolean delete) throws TransferFilesException {
+ Vector params = new Vector();
+
+ params.add(config.getBlogID());
+ params.add(config.getUser());
+ params.add(config.getPassword());
+ Hashtable message = new Hashtable();
+ File attf = new File(attachementFilename);
+ try {
+ if (attf.length() > 2 * 1000 * 1000) {
+ throw new TransferFilesException("File should not be close to 2MB. Currently it is " + attf.length() + " bytes.");
+ }
+ byte[] data;
+ if (delete) {
+ data = new byte[0];
+ } else {
+ data = new byte[(int) attf.length()];
+ InputStream in = new FileInputStream(attf);
+ int total = 0;
+ for (int read = 0; total + read < data.length && (read = in.read(data, read, data.length - read)) >= 0; total += read) {
+ } //read file into data
+ if (total != data.length) {
+ throw new TransferFilesException("Could not read all of " + attf);
+ }
+ }
+ message.put("bits", data);
+ message.put("name", attf.getName());
+ int index = attachementFilename.lastIndexOf('.');
+ if (index != (-1)) {
+ message.put("key", attachementFilename.substring(index+1, attachementFilename.length()).toLowerCase());
+ } else {
+ // assume png as default
+ message.put("key", "png");
+ }
+ message.put("postid", snipId); //required for snipsnap.
+ } catch (FileNotFoundException e) {
+ throw new TransferFilesException("Could not find image " + attf, e);
+ } catch (IOException e) {
+ throw new TransferFilesException("Could not read data from file " + attf, e);
+ }
+ params.add(message);
+ String attURL;
+ try {
+ Hashtable res = (Hashtable) xmlrpc.execute("metaWeblog.newMediaObject", params);
+ attURL = (String) res.get("url");
+ } catch (XmlRpcException e) {
+ throw new TransferFilesException("problem in communication with server", e);
+ } catch (IOException e) {
+ throw new TransferFilesException("IO problem trying to communicate with server", e);
+ }
+ // return att.setUrl(attURL);
+ }
+
+ /**
+ * delete the entry from the blog server
+ *
+ * @param entry
+ * @return
+ */
+ boolean deleteEntry(BlogEntry entry) throws TransferFilesException {
+ Vector params = new Vector(5);
+ // params.add(props.getProperty("blogid", "none")); //Should be the appkey, but what use is that?
+ params.add(config.getBlogID());
+ params.add(entry.getGuid());
+ params.add(config.getUser());
+ params.add(config.getPassword());
+ params.add(Boolean.TRUE);
+
+ Boolean result;
+ try {
+ result = (Boolean) xmlrpc.execute("blogger.deletePost", params);
+ } catch (XmlRpcException e) {
+ throw new TransferFilesException("problem in communication with server", e);
+ } catch (IOException e) {
+ throw new TransferFilesException("IO problem trying to communicate with server", e);
+ }
+
+ return result.booleanValue();
+ }
+
+ /**
+ *
+ * @param entry
+ * the entry that requires updating
+ * @return true if successful.
+ */
+ boolean updateEntry(BlogEntry entry, String title, StringBuffer htmlBuffer) throws TransferFilesException {
+ Vector params = new Vector(5);
+ Boolean result = null;
+
+ params.add(entry.getGuid());
+ params.add(config.getUser());
+ params.add(config.getPassword());
+
+ Hashtable message = new Hashtable(5);
+ message.put("title", title);
+ message.put("description", htmlBuffer.toString());
+ message.put("dateCreated", new Date(entry.getTime()));
+ params.add(message);
+
+ params.add(Boolean.TRUE);
+
+ try {
+ result = (Boolean) xmlrpc.execute("metaWeblog.editPost", params);
+ } catch (XmlRpcException e) {
+ throw new TransferFilesException("problem in communication with server", e);
+ } catch (IOException e) {
+ throw new TransferFilesException("IO problem trying to communicate with server", e);
+ }
+ return (result == null) ? false : result.booleanValue();
+
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.blog;
+
+public class TransferFilesException extends Exception {
+
+ public TransferFilesException() {
+ super();
+ }
+
+ public TransferFilesException(String message) {
+ super(message);
+ }
+
+ public TransferFilesException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public TransferFilesException(Throwable cause) {
+ super(cause);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.builder;
+
+import java.util.Iterator;
+
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+public class AddBuilderAction implements IObjectActionDelegate {
+ private IWorkbenchPart workbenchPart;
+
+ /**
+ *
+ */
+ public AddBuilderAction() {
+ super();
+ }
+
+ /**
+ * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+ */
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ workbenchPart = targetPart;
+ }
+
+ public void run(IAction action) {
+ ISelectionProvider selectionProvider = null;
+ selectionProvider = workbenchPart.getSite().getSelectionProvider();
+
+ StructuredSelection selection = null;
+ selection = (StructuredSelection) selectionProvider.getSelection();
+
+ //Shell shell = null;
+ Iterator iterator = null;
+ iterator = selection.iterator();
+ while (iterator.hasNext()) {
+ // obj => selected object in the view
+ Object obj = iterator.next();
+
+ // is it a resource
+ if (obj instanceof IResource) {
+ IResource resource = (IResource) obj;
+
+ // check if it's a project resource
+ switch (resource.getType()) {
+
+ case IResource.PROJECT:
+ addBuilder((IProject) resource);
+ }
+ }
+ }
+ }
+
+ /**
+ * @see IActionDelegate#selectionChanged(IAction, ISelection)
+ */
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ private void addBuilder(IProject project) {
+ IProjectDescription desc;
+ try {
+ desc = project.getDescription();
+
+ ICommand[] commands = desc.getBuildSpec();
+ boolean found = false;
+
+ for (int i = 0; i < commands.length; ++i) {
+ if (commands[i].getBuilderName().equals(WikiBuilder.BUILDER_ID)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ //add builder to project
+ ICommand command = desc.newCommand();
+ command.setBuilderName(WikiBuilder.BUILDER_ID);
+ ICommand[] newCommands = new ICommand[commands.length + 1];
+
+ // Add it before other builders.
+ System.arraycopy(commands, 0, newCommands, 1, commands.length);
+ newCommands[0] = command;
+ desc.setBuildSpec(newCommands);
+ project.setDescription(desc, null);
+ // add some default wiki project settings
+ Util.setWikiTextsPath(project);
+
+ }
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.builder;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.radeox.api.engine.WikiRenderEngine;
+import org.radeox.api.engine.context.InitialRenderContext;
+import org.radeox.api.engine.context.RenderContext;
+import org.radeox.engine.BaseRenderEngine;
+import org.plog4u.wiki.filter.FilterUtil;
+
+public class BuilderRenderEngine extends BaseRenderEngine implements WikiRenderEngine {
+ IProject fProject;
+
+ IPath fPath;
+
+ int fLevel;
+
+ public BuilderRenderEngine(IProject project, InitialRenderContext context) {
+ super(context);
+ fProject = project;
+ fPath = fProject.getFullPath();
+ fLevel = 0;
+ }
+
+ /**
+ *
+ * @param location -
+ * the absolute basepath or <code>null</code>
+ * @param name -
+ * the name of the wiki link
+ * @param extension -
+ * the file extension of the wiki text ( *.wp prefered )
+ * @param createHTMLLevel -
+ * if true prepend the directory level before the link i.e. <code>../../</code>
+ * @return
+ */
+ public String createHTMLLink(String location, String name, String extension, boolean createHTMLLevel) {
+ return FilterUtil.createHTMLLink(location, name, extension, createHTMLLevel, fLevel);
+ }
+
+ public boolean exists(String name) {
+
+ java.io.File file = new java.io.File(createHTMLLink(Util.getWikiTextsPath(fProject), name, "wp", false));
+ return file.exists();
+ // return name.equals("SnipSnap") || name.equals("stephan");
+ }
+
+ public boolean showCreate() {
+ return true;
+ }
+
+ public void appendLink(StringBuffer buffer, String name, String view, String anchor) {
+ String basePath = Util.getProjectsWikiOutputPath(fProject, WikiEditorPlugin.HTML_OUTPUT_PATH);
+ // String basePath = WikiEditorPlugin.getDefault().getPreferenceStore().getString(WikiConstants.HTML_OUTPUT_PATH);
+ buffer.append("<a href=\"");
+ buffer.append(createHTMLLink(null, name, "html", true));
+ buffer.append("#");
+ buffer.append(anchor);
+ buffer.append("\">");
+ buffer.append(view);
+ buffer.append("</a>");
+ //buffer.append("link:"+name+"|"+view+"#"+anchor);
+ }
+
+ public void appendLink(StringBuffer buffer, String name, String view) {
+ String basePath = Util.getProjectsWikiOutputPath(fProject, WikiEditorPlugin.HTML_OUTPUT_PATH);
+ // String basePath = WikiEditorPlugin.getDefault().getPreferenceStore().getString(WikiConstants.HTML_OUTPUT_PATH);
+ buffer.append("<a href=\"");
+ buffer.append(createHTMLLink(null, name, "html", true));
+ buffer.append("\">");
+ buffer.append(view);
+ buffer.append("</a>");
+ // buffer.append("link:" + name + "|" +view);
+ }
+
+ public void appendCreateLink(StringBuffer buffer, String name, String view) {
+ // if showCreate is true this method will be used to create a link to a
+ // "Wiki creationpage"
+ buffer.append(view);
+
+ // buffer.append("'").append(name).append("' - ");
+ // buffer.append("'").append(Encoder.escape(name)).append("'");
+ }
+
+ public String getName() {
+ return "BuilderRenderEngine";
+ }
+
+ public void setLevel(int level) {
+ fLevel = level;
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.builder;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Iterator;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+import net.sourceforge.phpeclipse.wiki.renderer.IContentRenderer;
+import net.sourceforge.phpeclipse.wiki.renderer.RendererFactory;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+/**
+ * Create a static HTML page
+ */
+public class CreatePageAction implements IObjectActionDelegate {
+ /**
+ * Constant for an empty char array
+ */
+ public static final char[] NO_CHAR = new char[0];
+
+ private static final int DEFAULT_READING_SIZE = 8192;
+
+ private IWorkbenchPart workbenchPart;
+
+ /**
+ *
+ */
+ public CreatePageAction() {
+ super();
+ }
+
+ /**
+ * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+ */
+ public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+ workbenchPart = targetPart;
+ }
+
+ public void run(IAction action) {
+ ISelectionProvider selectionProvider = null;
+ selectionProvider = workbenchPart.getSite().getSelectionProvider();
+
+ StructuredSelection selection = null;
+ selection = (StructuredSelection) selectionProvider.getSelection();
+
+ //Shell shell = null;
+ Iterator iterator = null;
+ iterator = selection.iterator();
+ while (iterator.hasNext()) {
+ // obj => selected object in the view
+ Object obj = iterator.next();
+
+ // is it a resource
+ if (obj instanceof IResource) {
+ IResource resource = (IResource) obj;
+
+ // check if it's a file resource
+ switch (resource.getType()) {
+
+ case IResource.FILE:
+ createPage((IFile) resource);
+ }
+ }
+ }
+ }
+
+ /**
+ * @see IActionDelegate#selectionChanged(IAction, ISelection)
+ */
+ public void selectionChanged(IAction action, ISelection selection) {
+ }
+
+ public static void createPage(IFile file) {
+ String srcBasePath = Util.getWikiTextsPath(file);
+ String binBasePath = Util.getProjectsWikiOutputPath(file.getProject(), WikiEditorPlugin.HTML_OUTPUT_PATH);
+ createPage(file, binBasePath, srcBasePath);
+ }
+
+ public static void createPage(IFile file, String binBasepath, String srcBasePath) {
+ // only interested in files with the "wp" extension
+ if ("wp".equalsIgnoreCase(file.getFileExtension())) {
+ try {
+ IContentRenderer renderer = RendererFactory.createContentRenderer(file.getProject());
+ convertWikiFile(file, binBasepath, srcBasePath, renderer);
+ } catch (InstantiationException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (CoreException e1) {
+ // TODO Auto-generated catch block
+ e1.printStackTrace();
+ }
+ } else {
+ String fname = file.getName().toLowerCase();
+ if ((fname.charAt(0) == '.') || "project.index".equals(fname) || "cvs".equals(fname) || "entries".equals(fname)
+ || "repository".equals(fname) || "root".equals(fname)) {
+ // ignore meta information
+ return;
+ }
+ // copy the file
+ FileOutputStream output = null;
+ InputStream contentStream = null;
+
+ try {
+ String filename = Util.getHTMLFileName(file, binBasepath, srcBasePath);
+ if (filename != null) {
+ int index = filename.lastIndexOf('/');
+ if (index >= 0) {
+ File ioFile = new File(filename.substring(0, index));
+ if (!ioFile.isDirectory()) {
+ ioFile.mkdirs();
+ }
+ }
+ output = new FileOutputStream(filename);
+
+ contentStream = file.getContents(false);
+ int chunkSize = contentStream.available();
+ byte[] readBuffer = new byte[chunkSize];
+ int n = contentStream.read(readBuffer);
+
+ while (n > 0) {
+ output.write(readBuffer);
+ n = contentStream.read(readBuffer);
+ }
+ }
+ } catch (Exception e) {
+
+ } finally {
+ try {
+ if (output != null)
+ output.close();
+ if (contentStream != null)
+ contentStream.close();
+ } catch (IOException e1) {
+ }
+ }
+ }
+ }
+
+ public static void convertWikiFile(IFile file, String binBasePath, String srcBasePath, IContentRenderer renderer)
+ throws CoreException {
+ StringBuffer htmlBuffer = new StringBuffer();
+ convertWikiBuffer(htmlBuffer, file, renderer, true);
+ String htmlName = Util.getHTMLFileName(file, binBasePath, srcBasePath);
+ if (htmlName != null) {
+ writeHTMLFile(htmlBuffer, htmlName);
+ }
+ }
+
+ public static void getWikiBuffer(StringBuffer htmlBuffer, IFile file) throws CoreException {
+ BufferedInputStream stream = new BufferedInputStream(file.getContents());
+ try {
+ htmlBuffer.append(getInputStreamAsCharArray(stream, -1, null));
+ return;
+ //new String(getInputStreamAsCharArray(stream, -1, null));
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (stream != null) {
+ stream.close();
+ }
+ } catch (IOException e) {
+ }
+ }
+ return;
+ }
+
+ public static void convertWikiBuffer(StringBuffer htmlBuffer, IFile file, IContentRenderer renderer, boolean completeHTML)
+ throws CoreException {
+ BufferedInputStream stream = new BufferedInputStream(file.getContents());
+ try {
+ String content = new String(getInputStreamAsCharArray(stream, -1, null));
+ String srcPath = Util.getWikiTextsPath(file);
+ String filePath = file.getLocation().toString(); // file.getProjectRelativePath().toString()
+ if (filePath.startsWith(srcPath)) {
+ filePath = filePath.substring(srcPath.length()+1);
+ }
+ createWikiBuffer(htmlBuffer, filePath, content, renderer, completeHTML);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ try {
+ if (stream != null) {
+ stream.close();
+ }
+ } catch (IOException e) {
+ }
+ }
+ }
+
+ /**
+ * @param htmlBuffer
+ * @param fileName
+ * @param content
+ * @param renderer
+ */
+ public static void createWikiBuffer(StringBuffer htmlBuffer, String fileName, String content, IContentRenderer renderer,
+ boolean completeHTML) {
+ // calculate the <i>depth</i> of the file (i.e. ../../../ as much as needed)
+ int index = 0;
+ int level = 0;
+ while (index >= 0) {
+ index = fileName.indexOf('/', index);
+ if (index >= 0) {
+ level++;
+ index++;
+ }
+ }
+ renderer.render(content, htmlBuffer, level, completeHTML);
+ }
+
+ public static void writeHTMLFile(StringBuffer buffer, String filename) {
+ int index = filename.lastIndexOf('/');
+ if (index >= 0) {
+ File file = new File(filename.substring(0, index));
+ if (!file.isDirectory()) {
+ file.mkdirs();
+ }
+ }
+ FileWriter fileWriter;
+ try {
+ fileWriter = new FileWriter(filename);
+ fileWriter.write(buffer.toString());
+ fileWriter.close();
+ } catch (FileNotFoundException e) {
+ // ignore exception; project is deleted by fUser
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Returns the given input stream's contents as a character array. If a length is specified (ie. if length != -1), only length
+ * chars are returned. Otherwise all chars in the stream are returned. Note this doesn't close the stream.
+ *
+ * @throws IOException
+ * if a problem occured reading the stream.
+ */
+ public static char[] getInputStreamAsCharArray(InputStream stream, int length, String encoding) throws IOException {
+ InputStreamReader reader = null;
+ reader = encoding == null ? new InputStreamReader(stream) : new InputStreamReader(stream, encoding);
+ char[] contents;
+ if (length == -1) {
+ contents = NO_CHAR;
+ int contentsLength = 0;
+ int amountRead = -1;
+ do {
+ int amountRequested = Math.max(stream.available(), DEFAULT_READING_SIZE); // read at least 8K
+
+ // resize contents if needed
+ if (contentsLength + amountRequested > contents.length) {
+ System.arraycopy(contents, 0, contents = new char[contentsLength + amountRequested], 0, contentsLength);
+ }
+
+ // read as many chars as possible
+ amountRead = reader.read(contents, contentsLength, amountRequested);
+
+ if (amountRead > 0) {
+ // remember length of contents
+ contentsLength += amountRead;
+ }
+ } while (amountRead != -1);
+
+ // resize contents if necessary
+ if (contentsLength < contents.length) {
+ System.arraycopy(contents, 0, contents = new char[contentsLength], 0, contentsLength);
+ }
+ } else {
+ contents = new char[length];
+ int len = 0;
+ int readSize = 0;
+ while ((readSize != -1) && (len != length)) {
+ // See PR 1FMS89U
+ // We record first the read size. In this case len is the actual
+ // read size.
+ len += readSize;
+ readSize = reader.read(contents, len, length - len);
+ }
+ // See PR 1FMS89U
+ // Now we need to resize in case the default encoding used more than
+ // one byte for each
+ // character
+ if (len != length)
+ System.arraycopy(contents, 0, (contents = new char[len]), 0, len);
+ }
+
+ return contents;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.builder;
+
+import java.io.IOException;
+import java.util.Map;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.export.WikiExporter;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.internal.resources.Folder;
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+public class WikiBuilder extends IncrementalProjectBuilder {
+
+ class WikiVisitor implements IResourceDeltaVisitor {
+ String fBinBasePath;
+
+ String fSrcBasePath;
+
+ public WikiVisitor(String binBasePath, String srcBasePath) {
+ fBinBasePath = binBasePath;
+ fSrcBasePath = srcBasePath;
+ }
+
+ public boolean visit(IResourceDelta delta) {
+ IResource resource = delta.getResource();
+ if (DEBUG) {
+ System.out.println(resource.toString());
+ }
+ if (delta.getKind() == IResourceDelta.REMOVED && resource.getType() == IResource.FILE) {
+ // remove this file from the wiki publishing directory
+ String htmlName = Util.getHTMLFileName((IFile) resource, fBinBasePath, fSrcBasePath);
+ if (htmlName != null) {
+ java.io.File file = new java.io.File(htmlName);
+ if (file.exists()) {
+ file.delete();
+ }
+ }
+ return true;
+ }
+ //only interested in changed resources at this point (not added or removed)
+ if (delta.getKind() != IResourceDelta.CHANGED)
+ return true;
+ //only interested in content changes
+ if ((delta.getFlags() & IResourceDelta.CONTENT) == 0)
+ return true;
+ if (resource.getType() == IResource.FILE) {
+ CreatePageAction.createPage((IFile) resource);
+ }
+ return true;
+ }
+ }
+
+ public static final String BUILDER_ID = "net.sourceforge.phpeclipse.wiki.wikibuilder";
+
+ private static final boolean DEBUG = false;
+
+ private IProject fProject;
+
+ private IWorkbench workbench;
+
+ public WikiBuilder() {
+ workbench = PlatformUI.getWorkbench();
+ fProject = null;
+ }
+
+ protected IProject[] build(int kind, Map args, IProgressMonitor _monitor) {
+ try {
+ fProject = getProject();
+ ICommand[] commands = fProject.getDescription().getBuildSpec();
+ boolean found = false;
+ for (int i = 0; i < commands.length; i++) {
+ if (commands[i].getBuilderName().equals(BUILDER_ID)) {
+ found = true;
+ break;
+ }
+ }
+ // fProject.hasNature()
+ if (found && fProject != null && fProject.isAccessible()) {
+
+ if (_monitor == null)
+ _monitor = new NullProgressMonitor();
+ switch (kind) {
+ case INCREMENTAL_BUILD:
+ if (DEBUG) {
+ System.out.println("INCREMENTAL_BUILD requested");
+ }
+ incrementalBuild();
+ break;
+ // we don't need auto build, because on every save we create a new *.html file ?
+ case AUTO_BUILD:
+ if (DEBUG) {
+ System.out.println("AUTO_BUILD requested");
+ }
+ incrementalBuild();
+ break;
+ case FULL_BUILD:
+ if (DEBUG) {
+ System.out.println("FULL_BUILD requested");
+ }
+ fullBuild(_monitor);
+ break;
+ default:
+ // unknown build kind requested;
+ }
+ // fProject.refreshLocal(1,_monitor);
+ }
+ } catch (Exception x) {
+
+ }
+ return new IProject[0];
+ }
+
+ private void fullBuild(IProgressMonitor monitor) throws CoreException, IOException {
+ try {
+ WikiExporter wikiExporter = new WikiExporter();
+ String srcBasePath = Util.getProjectsWikiTextsPath(fProject);
+ String basePath = Util.getProjectsWikiOutputPath(fProject, WikiEditorPlugin.HTML_OUTPUT_PATH);
+ wikiExporter.export(fProject, basePath, srcBasePath, monitor);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (CoreException e) {
+ e.printStackTrace();
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void incrementalBuild() throws CoreException, IOException {
+ IResourceDelta delta = getDelta(fProject);
+ String srcBasePath = Util.getProjectsWikiTextsPath(fProject);
+ String basePath = Util.getProjectsWikiOutputPath(fProject, WikiEditorPlugin.HTML_OUTPUT_PATH);
+ IResourceDeltaVisitor visitor = new WikiVisitor(basePath, srcBasePath);
+ if (delta != null)
+ delta.accept(visitor);
+ }
+
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.editor;
+
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.IEditorRegistry;
+import org.eclipse.ui.IPersistableElement;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * An EditorInput for an external file.
+ */
+public class ExternalEditorInput implements IStorageEditorInput {
+
+ IStorage externalFile;
+
+ /**
+ * Two ExternalEditorInputs are equal if their IStorage's are equal.
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (!(obj instanceof ExternalEditorInput))
+ return false;
+ ExternalEditorInput other = (ExternalEditorInput) obj;
+ return externalFile.equals(other.externalFile);
+ }
+
+ /*
+ * @see IEditorInput#exists()
+ */
+ public boolean exists() {
+ // External file can not be deleted
+ return true;
+ }
+
+ /*
+ * @see IAdaptable#getAdapter(Class)
+ */
+ public Object getAdapter(Class adapter) {
+ return null;
+ }
+
+ /*
+ * @see IEditorInput#getContentType()
+ */
+ public String getContentType() {
+ return externalFile.getFullPath().getFileExtension();
+ }
+
+ /*
+ * @see IEditorInput#getFullPath()
+ */
+ public String getFullPath() {
+ return externalFile.getFullPath().toString();
+ }
+
+ /*
+ * @see IEditorInput#getImageDescriptor()
+ */
+ public ImageDescriptor getImageDescriptor() {
+ IEditorRegistry registry = PlatformUI.getWorkbench().getEditorRegistry();
+ return registry.getImageDescriptor(externalFile.getFullPath().getFileExtension());
+ }
+
+ /*
+ * @see IEditorInput#getName()
+ */
+ public String getName() {
+ return externalFile.getName();
+ }
+
+ /*
+ * @see IEditorInput#getPersistable()
+ */
+ public IPersistableElement getPersistable() {
+ return null;
+ }
+
+ /*
+ * see IStorageEditorInput#getStorage()
+ */
+ public IStorage getStorage() {
+ return externalFile;
+ }
+
+ /*
+ * @see IEditorInput#getToolTipText()
+ */
+ public String getToolTipText() {
+ return externalFile.getFullPath().toString();
+ }
+
+ public ExternalEditorInput(IStorage exFile) {
+ externalFile = exFile;
+ }
+}
--- /dev/null
+/***********************************************************************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ **********************************************************************************************************************************/
+package net.sourceforge.phpeclipse.wiki.editor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaSection;
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaText;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.Region;
+import org.eclipse.jface.text.TextUtilities;
+import org.eclipse.jface.text.contentassist.CompletionProposal;
+import org.eclipse.jface.text.contentassist.ICompletionProposal;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContextInformation;
+import org.eclipse.jface.text.contentassist.IContextInformationValidator;
+import org.eclipse.jface.text.templates.DocumentTemplateContext;
+import org.eclipse.jface.text.templates.Template;
+import org.eclipse.jface.text.templates.TemplateContext;
+import org.eclipse.jface.text.templates.TemplateContextType;
+import org.eclipse.jface.text.templates.TemplateException;
+import org.eclipse.jface.text.templates.TemplateProposal;
+import org.eclipse.swt.graphics.Image;
+
+public class WikiCompletionProcessor implements IContentAssistProcessor {
+
+ private static final String TEMPLATE_ICON = "icons/template.gif";
+
+// private static final String PREPARATION_TEMPLATE_CTX = "net.sourceforge.phpeclipse.wiki.editor.preparation";
+
+ private static final String INGREDIENTS_TEMPLATE_CTX = "net.sourceforge.phpeclipse.wiki.editor.templates";
+
+ private static final class ProposalComparator implements Comparator {
+ public int compare(Object o1, Object o2) {
+ return ((TemplateProposal) o2).getRelevance() - ((TemplateProposal) o1).getRelevance();
+ }
+ }
+
+ private static final Comparator fgProposalComparator = new ProposalComparator();
+
+ private final WikiEditor fEditor;
+
+ public WikiCompletionProcessor(WikiEditor editor) {
+ fEditor = editor;
+ }
+
+ public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int offset) {
+ WikipediaSection section = fEditor.getSection();
+ if (section == null)
+ return null;
+
+ ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection();
+ // adjust offset to start of normalized selection:
+ if (selection.getOffset() != offset)
+ offset = selection.getOffset();
+
+ String prefix = getPrefix(viewer, offset);
+ Region region = new Region(offset - prefix.length(), prefix.length() + selection.getLength());
+
+ ICompletionProposal[] templateProposals = computeTemplateProposals(viewer, region, section, prefix);
+// ICompletionProposal[] ingredientProposals = computeIngredientsProposals(viewer, region, recipe, prefix);
+// ICompletionProposal[] titleProposals = computeTitleProposals(viewer, region, recipe, prefix);
+ List result = new ArrayList();
+// result.addAll(Arrays.asList(ingredientProposals));
+ result.addAll(Arrays.asList(templateProposals));
+// result.addAll(Arrays.asList(titleProposals));
+
+ return (ICompletionProposal[]) result.toArray(new ICompletionProposal[result.size()]);
+ }
+
+ private ICompletionProposal[] computeTitleProposals(ITextViewer viewer, IRegion region, WikipediaText recipe, String prefix) {
+ List props = new ArrayList(2);
+ // if (recipe.getIngredientsSection() == null)
+ // props.add(createTitleProposal("Zutaten:", region, viewer));
+ // if (recipe.getPreparationSection() == null)
+ // props.add(createTitleProposal("Zubereitung:", region, viewer));
+ return (ICompletionProposal[]) props.toArray(new ICompletionProposal[props.size()]);
+ }
+
+ private CompletionProposal createTitleProposal(String name, IRegion region, ITextViewer viewer) {
+ String lineDelimiter = TextUtilities.getDefaultLineDelimiter(viewer.getDocument());
+ return new CompletionProposal(name + lineDelimiter, region.getOffset(), region.getLength(), region.getOffset() + name.length()
+ + lineDelimiter.length(), null, name, null, null);
+ }
+
+ private ICompletionProposal[] computeIngredientsProposals(ITextViewer viewer, IRegion region, WikipediaText recipe, String prefix) {
+ return new ICompletionProposal[0];
+ // Step[] steps= recipe.getSteps();
+ // if (steps == null || steps.length == 0)
+ // return new ICompletionProposal[0];
+ //
+ // int offset= region.getOffset();
+ // Step first= steps[0];
+ // if (offset < first.getOffset())
+ // return new ICompletionProposal[0];
+ //
+ // Ingredient[] ingredients= recipe.getIngredients();
+ // if (ingredients == null)
+ // return new ICompletionProposal[0];
+ //
+ // prefix= prefix.toLowerCase();
+ //
+ // ArrayList proposals= new ArrayList();
+ // for (int i= 0; i < ingredients.length; i++) {
+ // String ingredient= ingredients[i].getName();
+ // if (ingredient.toLowerCase().startsWith(prefix))
+ // proposals.add(new CompletionProposal(ingredient, offset, region.getLength(), ingredient.length()));
+ // }
+ // return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[proposals.size()]);
+ }
+
+ private TemplateContextType getContextType(WikipediaSection section, int offset) {
+// if (recipe.getPreparationSection() != null && recipe.getPreparationSection().getOffset() < offset)
+// return WikiEditorPlugin.getDefault().getContextTypeRegistry().getContextType(PREPARATION_TEMPLATE_CTX);
+// else
+ return WikiEditorPlugin.getDefault().getContextTypeRegistry().getContextType(INGREDIENTS_TEMPLATE_CTX);
+ }
+
+ /**
+ * Creates a concrete template context for the given region in the document. This involves finding out which context fType is valid
+ * at the given location, and then creating a context of this fType. The default implementation returns a
+ * <code>DocumentTemplateContext</code> for the context fType at the given location.
+ *
+ * @param viewer
+ * the viewer for which the context is created
+ * @param region
+ * the region into <code>document</code> for which the context is created
+ * @return a template context that can handle template insertion at the given location, or <code>null</code>
+ */
+ private TemplateContext createContext(ITextViewer viewer, IRegion region, WikipediaSection recipe) {
+ TemplateContextType contextType = getContextType(recipe, region.getOffset());
+ if (contextType != null) {
+ IDocument document = viewer.getDocument();
+ return new DocumentTemplateContext(contextType, document, region.getOffset(), region.getLength());
+ }
+ return null;
+ }
+
+ private ICompletionProposal[] computeTemplateProposals(ITextViewer viewer, IRegion region, WikipediaSection recipe, String prefix) {
+ TemplateContext context = createContext(viewer, region, recipe);
+ if (context == null)
+ return new ICompletionProposal[0];
+
+ ITextSelection selection = (ITextSelection) viewer.getSelectionProvider().getSelection();
+ context.setVariable("selection", selection.getText()); // name of the selection variables {line, word}_selection
+
+ String id = context.getContextType().getId();
+ Template[] templates = WikiEditorPlugin.getDefault().getTemplateStore().getTemplates(id);
+
+ List matches = new ArrayList();
+ for (int i = 0; i < templates.length; i++) {
+ Template template = templates[i];
+ try {
+ context.getContextType().validate(template.getPattern());
+ } catch (TemplateException e) {
+ continue;
+ }
+ int relevance = getRelevance(template, prefix);
+ if (relevance > 0) {
+ matches.add(new TemplateProposal(template, context, region, getImage(template), relevance));
+ }
+ }
+
+ Collections.sort(matches, fgProposalComparator);
+
+ return (ICompletionProposal[]) matches.toArray(new ICompletionProposal[matches.size()]);
+ }
+
+ /**
+ * Returns the relevance of a template given a prefix. The default implementation returns a number greater than zero if the
+ * template name starts with the prefix, and zero otherwise.
+ *
+ * @param template
+ * the template to compute the relevance for
+ * @param prefix
+ * the prefix after which content assist was requested
+ * @return the relevance of <code>template</code>
+ * @see #getPrefix(ITextViewer, int)
+ */
+ private int getRelevance(Template template, String prefix) {
+ if (template.getName().startsWith(prefix))
+ return 90;
+ return 0;
+ }
+
+ private String getPrefix(ITextViewer viewer, int offset) {
+ int i = offset;
+ IDocument document = viewer.getDocument();
+ if (i > document.getLength())
+ return "";
+
+ try {
+ while (i > 0) {
+ char ch = document.getChar(i - 1);
+ if (!Character.isLetterOrDigit(ch))
+ break;
+ i--;
+ }
+
+ return document.get(i, offset - i);
+ } catch (BadLocationException e) {
+ return "";
+ }
+ }
+
+ /**
+ * Always return the default image.
+ */
+ private Image getImage(Template template) {
+ ImageRegistry registry = WikiEditorPlugin.getDefault().getImageRegistry();
+ Image image = registry.get(TEMPLATE_ICON);
+ if (image == null) {
+ ImageDescriptor desc = WikiEditorPlugin.imageDescriptorFromPlugin("net.sourceforge.phpeclipse.wiki.editor", TEMPLATE_ICON);
+ registry.put(TEMPLATE_ICON, desc);
+ image = registry.get(TEMPLATE_ICON);
+ }
+ return image;
+ }
+
+ public IContextInformation[] computeContextInformation(ITextViewer viewer, int offset) {
+ return null;
+ }
+
+ public char[] getCompletionProposalAutoActivationCharacters() {
+ return null;
+ }
+
+ public char[] getContextInformationAutoActivationCharacters() {
+ return null;
+ }
+
+ public String getErrorMessage() {
+ return null;
+ }
+
+ public IContextInformationValidator getContextInformationValidator() {
+ return null;
+ }
+}
\ No newline at end of file
--- /dev/null
+/***********************************************************************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ **********************************************************************************************************************************/
+package net.sourceforge.phpeclipse.wiki.editor;
+
+import net.sourceforge.phpeclipse.webbrowser.views.BrowserView;
+import net.sourceforge.phpeclipse.wiki.builder.CreatePageAction;
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaSection;
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaText;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.text.source.projection.ProjectionSupport;
+import org.eclipse.jface.text.source.projection.ProjectionViewer;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.texteditor.TextOperationAction;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+
+public class WikiEditor extends AbstractDecoratedTextEditor {
+
+ private WikiOutlinePage fOutlinePage;
+
+ private WikipediaSection fSection;
+
+ private ProjectionSupport fProjectionSupport;
+
+ private WikiOccurrencesUpdater fOccurrencesUpdater;
+
+ public WikiEditor() {
+ setSourceViewerConfiguration(new WikiSourceViewerConfiguration(this, getSharedColors()));
+ }
+
+ public WikipediaSection getSection() {
+ return fSection;
+ }
+
+ public void setSection(WikipediaSection section) {
+ fSection = section;
+ if (fOutlinePage != null)
+ fOutlinePage.setWiki(section);
+
+ if (fOccurrencesUpdater != null)
+ fOccurrencesUpdater.update(getSourceViewer());
+ }
+
+ /*
+ * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+ */
+ public Object getAdapter(Class required) {
+ if (IContentOutlinePage.class.equals(required)) {
+ if (fOutlinePage == null)
+ fOutlinePage = new WikiOutlinePage(this);
+ return fOutlinePage;
+ }
+ if (fProjectionSupport != null) {
+ Object adapter = fProjectionSupport.getAdapter(getSourceViewer(), required);
+ if (adapter != null)
+ return adapter;
+ }
+ return super.getAdapter(required);
+ }
+
+ public void outlinePageClosed() {
+ fOutlinePage = null;
+ }
+
+ /*
+ * @see org.eclipse.ui.texteditor.AbstractTextEditor#createActions()
+ */
+ protected void createActions() {
+ super.createActions();
+
+ IAction action = new TextOperationAction(WikiEditorPlugin.getDefault().getResourceBundle(), "ContentAssistProposal.", this,
+ ISourceViewer.CONTENTASSIST_PROPOSALS);
+ action.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
+ setAction("ContentAssist.", action);
+ markAsStateDependentAction("ContentAssist.", true);
+ }
+
+ /*
+ * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#createPartControl(org.eclipse.swt.widgets.Composite)
+ */
+ public void createPartControl(Composite parent) {
+ super.createPartControl(parent);
+
+ ProjectionViewer projectionViewer = (ProjectionViewer) getSourceViewer();
+ fProjectionSupport = new ProjectionSupport(projectionViewer, getAnnotationAccess(), getSharedColors());
+ fProjectionSupport.install();
+ projectionViewer.doOperation(ProjectionViewer.TOGGLE);
+
+ fOccurrencesUpdater = new WikiOccurrencesUpdater(this);
+ }
+
+ /*
+ * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#createSourceViewer(org.eclipse.swt.widgets.Composite,
+ * org.eclipse.jface.text.source.IVerticalRuler, int)
+ */
+ protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler ruler, int styles) {
+ fAnnotationAccess = createAnnotationAccess();
+ fOverviewRuler = createOverviewRuler(getSharedColors());
+
+ ISourceViewer viewer = new ProjectionViewer(parent, ruler, fOverviewRuler, true, styles);
+ // ensure decoration support has been created and configured:
+ getSourceViewerDecorationSupport(viewer);
+
+ return viewer;
+ }
+
+ /*
+ * @see org.eclipse.ui.IWorkbenchPart#dispose()
+ */
+ public void dispose() {
+ fOccurrencesUpdater.dispose();
+ super.dispose();
+ }
+
+ public IDocument getDocument() {
+ IDocument doc = getDocumentProvider().getDocument(getEditorInput());
+ return doc;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.texteditor.AbstractTextEditor#editorSaved()
+ */
+ protected void editorSaved() {
+ super.editorSaved();
+ // doesn't work here, wikibuilder has to be finished with generating html page
+ IWorkbenchPage page = WikiEditorPlugin.getDefault().getActivePage();
+ try {
+ IViewPart part = page.findView(BrowserView.ID_BROWSER);
+ if (part == null) {
+ part = page.showView(BrowserView.ID_BROWSER);
+ } else {
+ // if (bringToTopPreview) {
+ // page.bringToTop(part);
+ // }
+ }
+ IEditorInput editorInput = null;
+ editorInput = this.getEditorInput();
+ if (editorInput instanceof IFileEditorInput) {
+ CreatePageAction.createPage(((IFileEditorInput) editorInput).getFile());
+ ((BrowserView) part).refresh();
+ }
+ } catch (Exception e) {
+ }
+ }
+
+
+}
\ No newline at end of file
--- /dev/null
+/***********************************************************************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ **********************************************************************************************************************************/
+
+package net.sourceforge.phpeclipse.wiki.editor;
+
+import net.sourceforge.phpeclipse.webbrowser.views.BrowserView;
+import net.sourceforge.phpeclipse.wiki.editor.action.WeblogWikiAction;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.texteditor.BasicTextEditorActionContributor;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
+import org.eclipse.ui.texteditor.RetargetTextEditorAction;
+
+public class WikiEditorContributor extends BasicTextEditorActionContributor {
+
+ private static final String CONTENTASSIST_ACTION = "net.sourceforge.phpeclipse.wiki.editor.ContentAssist";
+
+ private RetargetTextEditorAction fContentAssist;
+ public WikiEditorContributor() {
+ super();
+ fContentAssist = new RetargetTextEditorAction(WikiEditorPlugin.getDefault().getResourceBundle(), "ContentAssistProposal.");
+ fContentAssist.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
+ }
+
+ public void setActiveEditor(IEditorPart part) {
+ super.setActiveEditor(part);
+ ITextEditor editor = (part instanceof ITextEditor) ? (ITextEditor) part : null;
+ fContentAssist.setAction(getAction(editor, CONTENTASSIST_ACTION));
+ // jsurfer
+ setBrowserPreview(editor);
+ }
+
+ public void setBrowserPreview(ITextEditor editor) {
+ IWorkbenchPage page = WikiEditorPlugin.getDefault().getActivePage();
+ try {
+ IViewPart part = page.findView(BrowserView.ID_BROWSER);
+ if (part == null) {
+ part = page.showView(BrowserView.ID_BROWSER);
+ } else {
+ // if (bringToTopPreview) {
+ // page.bringToTop(part);
+ // }
+ }
+ IEditorInput editorInput = null;
+ if (editor != null) {
+ editorInput = editor.getEditorInput();
+ }
+ if (editorInput instanceof IFileEditorInput) {
+ IFile file = ((IFileEditorInput) editorInput).getFile();
+ String srcBasePath = Util.getWikiTextsPath(file);
+ String binBasePath = Util.getProjectsWikiOutputPath(file.getProject(), WikiEditorPlugin.HTML_OUTPUT_PATH);
+ String htmlName = Util.getHTMLFileName(file, binBasePath, srcBasePath);
+ if (htmlName!=null) {
+ ((BrowserView) part).setUrl(htmlName);
+ }
+ }
+ } catch (Exception e) {
+ }
+ }
+
+ public void contributeToMenu(IMenuManager menu) {
+
+ super.contributeToMenu(menu);
+
+}
+
+ public void init(IActionBars bars, IWorkbenchPage page) {
+ super.init(bars, page);
+ bars.setGlobalActionHandler(CONTENTASSIST_ACTION, fContentAssist);
+
+ }
+
+ public void dispose() {
+ setActiveEditor(null);
+ super.dispose();
+ }
+}
\ No newline at end of file
--- /dev/null
+ContentAssistProposal.label=Content Assist
+ContentAssistProposal.tooltip=Content Assist
+ContentAssistProposal.description=Content Assist
+
+Export.exportFile=Export Wiki file:
+Export.exportFolder=Export Wiki folder:
+Export.wizardTitle=Wiki Text Exporter
+Export.wizardDescription=Export Wiki texts to the file system
+Export.wizardBrowse=Browse...
+Export.wizardSelectFolder=Select a folder
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.editor;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import net.sourceforge.phpeclipse.wiki.internal.IConfigurationWorkingCopy;
+import net.sourceforge.phpeclipse.wiki.internal.ConfigurationManager;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.text.templates.ContextTypeRegistry;
+import org.eclipse.jface.text.templates.persistence.TemplateStore;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.editors.text.templates.ContributionContextTypeRegistry;
+import org.eclipse.ui.editors.text.templates.ContributionTemplateStore;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+public class WikiEditorPlugin extends AbstractUIPlugin {
+
+ private static WikiEditorPlugin fgPlugin;
+ public static final String HTTP_QUERY = "HTTP Query";
+ public static final String WIKIPEDIA_GET_TEXT = "Wikipedia-Load Text";
+ public static final String WEBLOG_API_SEND = "MetaWeblog API-Post";
+
+ public static final String[] CONFIGURATION_TYPES = {
+ HTTP_QUERY,
+ WIKIPEDIA_GET_TEXT,
+ WEBLOG_API_SEND
+ };
+ //image paths
+ public static final String ICON_PATH = "icons/full/"; //$NON-NLS-1$
+
+ public final static String PLUGIN_ID = "net.sourceforge.phpeclipse.wiki";
+
+ public final static String HTML_OUTPUT_PATH = "__static_wiki_folder";
+
+ public final static String WIKI_TEXTS_BASE_PATH = "__wiki_texts_base_path";
+
+ private static ConfigurationManager manager;
+
+ public static final String IMG_MONITOR_ON = "monitorOn";
+
+ public static final String IMG_MONITOR_OFF = "monitorOff";
+
+ /**
+ * Creates an image and places it in the image registry.
+ *
+ * @param id
+ * the identifier for the image
+ * @param baseURL
+ * the base URL for the image
+ */
+ protected static void createImageDescriptor(WikiEditorPlugin plugin, String id, URL baseURL) {
+ // Delegate to the plugin instance to avoid concurrent class loading problems
+ plugin.privateCreateImageDescriptor(id, baseURL);
+ }
+
+ public static WikiEditorPlugin getDefault() {
+ return fgPlugin;
+ }
+
+ /**
+ * Returns the image descriptor for the given image ID. Returns null if there is no such image.
+ *
+ * @param id
+ * the identifier for the image to retrieve
+ * @return the image associated with the given ID
+ */
+ public static ImageDescriptor getImageDescriptor(String id) {
+ // Delegate to the plugin instance to avoid concurrent class loading problems
+ return getDefault().privateGetImageDescriptor(id);
+ }
+
+ /**
+ * Convenience method to get an image descriptor for an extension
+ *
+ * @param extension
+ * the extension declaring the image
+ * @param subdirectoryAndFilename
+ * the path to the image
+ * @return the image
+ */
+ public static ImageDescriptor getImageDescriptorFromExtension(IExtension extension, String subdirectoryAndFilename) {
+ IPluginDescriptor pluginDescriptor = extension.getDeclaringPluginDescriptor();
+ URL path = pluginDescriptor.getInstallURL();
+ URL fullPathString = null;
+ try {
+ fullPathString = new URL(path, subdirectoryAndFilename);
+ return ImageDescriptor.createFromURL(fullPathString);
+ } catch (MalformedURLException e) {
+ }
+ return null;
+ }
+
+ public static String getResourceString(String key) {
+ ResourceBundle bundle = WikiEditorPlugin.getDefault().getResourceBundle();
+ try {
+ return (bundle != null) ? bundle.getString(key) : key;
+ } catch (MissingResourceException e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the standard display to be used. The method first checks, if the thread calling this method has an associated display.
+ * If so, this display is returned. Otherwise the method returns the default display.
+ */
+ public static Display getStandardDisplay() {
+ Display display = Display.getCurrent();
+ if (display == null) {
+ display = Display.getDefault();
+ }
+ return display;
+ }
+
+ private ContributionContextTypeRegistry fContextTypeRegistry;
+
+ private ResourceBundle fResourceBundle;
+
+ private ContributionTemplateStore fTemplateStore;
+
+ private Hashtable imageDescriptors = new Hashtable(20);
+
+ public WikiEditorPlugin(IPluginDescriptor descriptor) {
+ super(descriptor);
+ initializeImages();
+ fgPlugin = this;
+ manager = ConfigurationManager.getInstance();
+ try {
+ fResourceBundle = ResourceBundle.getBundle("net.sourceforge.phpeclipse.wiki.editor.WikiEditorMessages");
+ } catch (MissingResourceException x) {
+ fResourceBundle = null;
+ }
+ }
+
+ /**
+ * Creates an image and places it in the image registry.
+ */
+ protected void createImageDescriptor(String id, URL baseURL) {
+ URL url = null;
+ try {
+ url = new URL(baseURL, ICON_PATH + id);
+ } catch (MalformedURLException e) {
+ }
+ ImageDescriptor desc = ImageDescriptor.createFromURL(url);
+ imageDescriptors.put(id, desc);
+ }
+
+ public IWorkbenchPage getActivePage() {
+ IWorkbenchWindow window = getWorkbench().getActiveWorkbenchWindow();
+ if (window != null)
+ return window.getActivePage();
+ return null;
+ }
+
+ public ContextTypeRegistry getContextTypeRegistry() {
+ if (fContextTypeRegistry == null) {
+ fContextTypeRegistry = new ContributionContextTypeRegistry();
+ fContextTypeRegistry.addContextType("net.sourceforge.phpeclipse.wiki.editor.templates");
+ }
+ return fContextTypeRegistry;
+ }
+
+ public Image getImage(String key) {
+ Image image = getImageRegistry().get(key);
+ if (image == null) {
+ ImageDescriptor d = getImageDescriptor(key);
+ image = d.createImage();
+ getImageRegistry().put(key, image);
+ }
+ return image;
+ }
+
+ public ResourceBundle getResourceBundle() {
+ return fResourceBundle;
+ }
+
+ public TemplateStore getTemplateStore() {
+ if (fTemplateStore == null) {
+ fTemplateStore = new ContributionTemplateStore(getContextTypeRegistry(), getDefault().getPreferenceStore(), "templates");
+ try {
+ fTemplateStore.load();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ return fTemplateStore;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeDefaultPreferences(org.eclipse.jface.preference.IPreferenceStore)
+ */
+ protected void initializeDefaultPreferences(IPreferenceStore store) {
+ }
+
+ /*
+ * Initializes the table of images used in this plugin. The plugin is provided because this method is called before the plugin
+ * staic variable has been set. See the comment on the getPlugin() method for a description of why this is required.
+ */
+ private void initializeImages() {
+ URL baseURL = getDescriptor().getInstallURL();
+
+ // special
+ createImageDescriptor("glyphs/glyph1.gif", baseURL); //$NON-NLS-1$
+ createImageDescriptor("glyphs/glyph2.gif", baseURL); //$NON-NLS-1$
+ createImageDescriptor("glyphs/glyph3.gif", baseURL); //$NON-NLS-1$
+ createImageDescriptor("glyphs/glyph4.gif", baseURL); //$NON-NLS-1$
+ createImageDescriptor("glyphs/glyph5.gif", baseURL); //$NON-NLS-1$
+ createImageDescriptor("glyphs/glyph6.gif", baseURL); //$NON-NLS-1$
+ createImageDescriptor("glyphs/glyph7.gif", baseURL); //$NON-NLS-1$
+ createImageDescriptor("glyphs/glyph8.gif", baseURL); //$NON-NLS-1$
+
+ }
+
+ public void log(String message) {
+ getDefault().getLog().log(new Status(IStatus.OK, PLUGIN_ID, IStatus.OK, message, null));
+ }
+
+ public void log(String message, Exception e) {
+ getDefault().getLog().log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, "Caught exception", e));
+ }
+
+ public void logAndReport(String title, String message, Exception e) {
+ log(message, e);
+ reportError(title, message);
+ }
+
+ private void privateCreateImageDescriptor(String id, URL baseURL) {
+ URL url = null;
+ try {
+ url = new URL(baseURL, ICON_PATH + id);
+ } catch (MalformedURLException e) {
+ }
+ ImageDescriptor desc = ImageDescriptor.createFromURL(url);
+ imageDescriptors.put(id, desc);
+ }
+
+ private ImageDescriptor privateGetImageDescriptor(String id) {
+ if (!imageDescriptors.containsKey(id)) {
+ URL baseURL = WikiEditorPlugin.getDefault().getDescriptor().getInstallURL();
+ createImageDescriptor(getDefault(), id, baseURL);
+ }
+ return (ImageDescriptor) imageDescriptors.get(id);
+ }
+
+ public void reportError(String title, String message) {
+ try {
+ Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
+ MessageDialog.openError(shell, title, message);
+ } catch (RuntimeException e) {
+ log(e.getLocalizedMessage(), e);
+ }
+ }
+
+ public void startup() throws CoreException {
+ super.startup();
+ }
+
+ /**
+ * Returns the translated String found with the given key.
+ *
+ * @return java.lang.String
+ * @param key
+ * java.lang.String
+ */
+ public static String getResource(String key) {
+ try {
+ return Platform.getResourceString(getDefault().getBundle(), key);
+ } catch (Exception e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the translated String found with the given key, and formatted with the given object.
+ *
+ * @param key
+ * java.lang.String
+ * @param obj
+ * java.lang.Object[]
+ * @return java.lang.String
+ */
+ public static String getResource(String key, Object[] obj) {
+ try {
+ return MessageFormat.format(getResource(key), obj);
+ } catch (Exception e) {
+ return key;
+ }
+ }
+
+ /**
+ * Returns the translated String found with the given key, and formatted with the given object.
+ *
+ * @param key
+ * java.lang.String
+ * @param s
+ * java.lang.String
+ * @return java.lang.String
+ */
+ public static String getResource(String key, String s) {
+ try {
+ return MessageFormat.format(getResource(key), new String[] { s });
+ } catch (Exception e) {
+ return key;
+ }
+ }
+
+ /**
+ * Return a list of all the existing configurations.
+ *
+ * @return java.util.List
+ */
+ public static List getConfigurations() {
+ return manager.getConfigurations();
+ }
+
+ /**
+ * Create a new monitor.
+ *
+ * @return working copy
+ */
+ public static IConfigurationWorkingCopy createConfiguration() {
+ return manager.createConfiguration();
+ }
+
+ public static String[] getTypes() {
+ return CONFIGURATION_TYPES;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.editor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaText;
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaSection;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotation;
+import org.eclipse.jface.text.source.projection.ProjectionAnnotationModel;
+
+public class WikiFoldingStructureProvider {
+
+ private WikiEditor fEditor;
+
+ private IDocument fDocument;
+
+ private IProgressMonitor fProgressMonitor;
+
+ public WikiFoldingStructureProvider(WikiEditor editor) {
+ fEditor = editor;
+ }
+
+ public void setProgressMonitor(IProgressMonitor progressMonitor) {
+ fProgressMonitor = progressMonitor;
+ }
+
+ public void setDocument(IDocument document) {
+ fDocument = document;
+ }
+
+ public void updateFoldingRegions(WikipediaSection section) {
+ try {
+
+ ProjectionAnnotationModel model = (ProjectionAnnotationModel) fEditor.getAdapter(ProjectionAnnotationModel.class);
+ if (model == null)
+ return;
+
+ Set currentRegions = new HashSet();
+ addFoldingRegions(currentRegions, section.getChildren());
+ updateFoldingRegions(model, currentRegions);
+ } catch (BadLocationException e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void updateFoldingRegions(ProjectionAnnotationModel model, Set currentRegions) {
+ Annotation[] deletions = computeDifferences(model, currentRegions);
+
+ Map additionsMap = new HashMap();
+ for (Iterator iter = currentRegions.iterator(); iter.hasNext();)
+ additionsMap.put(new ProjectionAnnotation(), iter.next());
+
+ if ((deletions.length != 0 || additionsMap.size() != 0) && (fProgressMonitor == null || !fProgressMonitor.isCanceled()))
+ model.modifyAnnotations(deletions, additionsMap, new Annotation[] {});
+ }
+
+ private Annotation[] computeDifferences(ProjectionAnnotationModel model, Set current) {
+ List deletions = new ArrayList();
+ for (Iterator iter = model.getAnnotationIterator(); iter.hasNext();) {
+ Object annotation = iter.next();
+ if (annotation instanceof ProjectionAnnotation) {
+ Position position = model.getPosition((Annotation) annotation);
+ if (current.contains(position))
+ current.remove(position);
+ else
+ deletions.add(annotation);
+ }
+ }
+ return (Annotation[]) deletions.toArray(new Annotation[deletions.size()]);
+ }
+
+ private void addFoldingRegions(Set regions, Object[] elements) throws BadLocationException {
+ for (int i = 0; i < elements.length; i++) {
+ WikipediaSection element = (WikipediaSection) elements[i];
+ if (element.getOffset() >= 0) {
+ int startLine = fDocument.getLineOfOffset(element.getOffset());
+ int endLine = fDocument.getLineOfOffset(element.getOffset() + element.getLength());
+ if (startLine < endLine) {
+ int start = fDocument.getLineOffset(startLine);
+ int end = fDocument.getLineOffset(endLine) + fDocument.getLineLength(endLine);
+ Position position = new Position(start, end - start);
+ regions.add(position);
+ }
+
+ Object[] children = element.getChildren();
+ if (children != null) {
+ addFoldingRegions(regions, children);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.wiki.editor;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaText;
+
+import org.eclipse.jface.viewers.IPostSelectionProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.text.Position;
+import org.eclipse.jface.text.source.Annotation;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.jface.text.source.ISourceViewer;
+
+
+
+class WikiOccurrencesUpdater implements ISelectionChangedListener {
+ /**
+ * Annotation fType for recipe occurrences.
+ */
+ private static final String ANNOTATION_TYPE= "net.sourceforge.phpeclipse.wiki.editor.highlightannotation";
+ /**
+ * The editor we operate on.
+ */
+ private final WikiEditor fEditor;
+ /**
+ * The set of annotations added in the previous run, always replaced by a
+ * new run.
+ */
+ private final List fOldAnnotations= new LinkedList();
+
+ /**
+ * Creates a new instance on editor <code>editor</code>.
+ *
+ * @param editor the editor to mark occurrences on.
+ */
+ public WikiOccurrencesUpdater(WikiEditor editor) {
+ ((IPostSelectionProvider) editor.getSelectionProvider()).addPostSelectionChangedListener(this);
+ fEditor= editor;
+ }
+
+ /*
+ * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+ */
+ public void selectionChanged(SelectionChangedEvent event) {
+ update((ISourceViewer) event.getSource());
+ }
+
+ /**
+ * Updates the drawn annotations.
+ *
+ * @param viewer the viewer to get the document and annotation model from
+ */
+ public void update(ISourceViewer viewer) {
+ if (viewer==null) {
+ return;
+ }
+// try {
+ IDocument document= viewer.getDocument();
+ IAnnotationModel model= viewer.getAnnotationModel();
+ if (document == null || model == null)
+ return;
+
+ removeOldAnnotations(model);
+
+// String word= getWordAtSelection(fEditor.getSelectionProvider().getSelection(), document);
+// if (isIngredient(word)) {
+// createNewAnnotations(word, document, model);
+// }
+
+// } catch (BadLocationException e) {
+// // ignore
+// }
+ }
+
+ /**
+ * Removes the previous set of annotations from the annotation model.
+ *
+ * @param model the annotation model
+ */
+ private void removeOldAnnotations(IAnnotationModel model) {
+ for (Iterator it= fOldAnnotations.iterator(); it.hasNext();) {
+ Annotation annotation= (Annotation) it.next();
+ model.removeAnnotation(annotation);
+ }
+ fOldAnnotations.clear();
+ }
+
+ /**
+ * Returns the word at the current selection / caret position.
+ *
+ * @param selection the selection
+ * @param document the document
+ * @return the currently selected text, or the word at the caret if the
+ * selection has length 0
+ * @throws BadLocationException if accessing the document fails
+ */
+ private String getWordAtSelection(ISelection selection, IDocument document) throws BadLocationException {
+ if (selection instanceof ITextSelection) {
+ ITextSelection ts= (ITextSelection) selection;
+ int offset= ts.getOffset();
+ int end= offset + ts.getLength();
+
+ // non-empty selections
+ if (end != offset)
+ return ts.getText();
+
+ while (offset > 0 && isIngredientChar(document.getChar(offset - 1)))
+ offset--;
+ while (end < document.getLength() && isIngredientChar(document.getChar(end)))
+ end++;
+
+ return document.get(offset, end - offset);
+ }
+ return "";
+ }
+
+ private boolean isIngredientChar(char c) {
+ return !Character.isWhitespace(c) && c != ':' && c != ',' && c != '.';
+ }
+
+ /**
+ * Adds an annotation for every occurrence of
+ * <code>ingredient</code> in the document. Also stores the created
+ * annotations in <code>fOldAnnotations</code>.
+ *
+ * @param ingredient the word to look for
+ * @param document the document
+ * @param model the annotation model
+ */
+ private void createNewAnnotations(String ingredient, IDocument document, IAnnotationModel model) {
+ String content= document.get();
+ int idx= content.indexOf(ingredient);
+ while (idx != -1) {
+ Annotation annotation= new Annotation(ANNOTATION_TYPE, false, ingredient);
+ Position position= new Position(idx, ingredient.length());
+
+ model.addAnnotation(annotation, position);
+ fOldAnnotations.add(annotation);
+
+ idx= content.indexOf(ingredient, idx + 1);
+ }
+ }
+
+ public void dispose() {
+ ((IPostSelectionProvider) fEditor.getSelectionProvider()).removePostSelectionChangedListener(this);
+ }
+}
\ No newline at end of file
--- /dev/null
+/***********************************************************************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ **********************************************************************************************************************************/
+package net.sourceforge.phpeclipse.wiki.editor;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaText;
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaSection;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Composite;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.AbstractTreeViewer;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+
+public class WikiOutlinePage extends ContentOutlinePage {
+
+ private WikiEditor fEditor;
+
+ private static class WikiContentProvider implements ITreeContentProvider {
+
+ public Object[] getChildren(Object parentElement) {
+ return ((WikipediaSection) parentElement).getChildren();
+ }
+
+ public Object getParent(Object element) {
+ return ((WikipediaSection) element).getParent();
+ }
+
+ public boolean hasChildren(Object element) {
+ Object[] children = getChildren(element);
+ return children != null && children.length != 0;
+ }
+
+ public Object[] getElements(Object inputElement) {
+ return getChildren(inputElement);
+ }
+
+ public void dispose() {
+ // do nothing
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ // do nothing
+ }
+ }
+
+ private static class WikiLabelProvider extends LabelProvider {
+ private static URL fgIconBaseURL = WikiEditorPlugin.getDefault().getBundle().getEntry("/icons/");
+
+ private final Image fIngredientsSectionIcon = createImage("ingredients.gif");
+
+ private final Image fIngredientIcon = createImage("ingredient.gif");
+
+ private final Image fPreparationSectionIcon = createImage("preparation.gif");
+
+ private final Image fStepIcon = createImage("step.gif");
+
+ public static Image createImage(String icon) {
+ try {
+ ImageDescriptor id = ImageDescriptor.createFromURL(new URL(fgIconBaseURL, icon));
+ return id.createImage();
+ } catch (MalformedURLException e) {
+ // no icon ...
+ }
+ return null;
+ }
+
+ public String getText(Object element) {
+ return ((WikipediaSection) element).getName();
+ }
+
+ public Image getImage(Object element) {
+ if (element instanceof WikipediaSection)
+ return fStepIcon;
+ return super.getImage(element);
+ }
+
+ public void dispose() {
+ super.dispose();
+ if (fIngredientsSectionIcon != null)
+ fIngredientsSectionIcon.dispose();
+ if (fIngredientIcon != null)
+ fIngredientIcon.dispose();
+ if (fPreparationSectionIcon != null)
+ fPreparationSectionIcon.dispose();
+ if (fStepIcon != null)
+ fStepIcon.dispose();
+ }
+ }
+
+ public WikiOutlinePage(WikiEditor editor) {
+ fEditor = editor;
+ }
+
+ public void createControl(Composite parent) {
+ super.createControl(parent);
+ TreeViewer treeViewer = getTreeViewer();
+ treeViewer.setLabelProvider(new WikiLabelProvider());
+ treeViewer.setContentProvider(new WikiContentProvider());
+ treeViewer.setAutoExpandLevel(AbstractTreeViewer.ALL_LEVELS);
+ treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ if (!(event.getSelection() instanceof IStructuredSelection))
+ return;
+ IStructuredSelection selection = (IStructuredSelection) event.getSelection();
+ if (selection.size() != 1)
+ return;
+ Object element = selection.getFirstElement();
+ if (!(element instanceof WikipediaSection))
+ return;
+ WikipediaSection recipeElement = (WikipediaSection) element;
+ fEditor.selectAndReveal(recipeElement.getOffset(), recipeElement.getLength());
+ }
+ });
+ setWiki(fEditor.getSection());
+ }
+
+ public void setWiki(WikipediaSection section) {
+ getTreeViewer().setInput(section);
+ }
+
+ public void dispose() {
+ super.dispose();
+ fEditor.outlinePageClosed();
+ fEditor = null;
+ }
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.wiki.editor;
+
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaOutlineParser;
+import net.sourceforge.phpeclipse.wiki.editor.model.WikipediaSection;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+import org.eclipse.jface.text.reconciler.DirtyRegion;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategy;
+import org.eclipse.jface.text.reconciler.IReconcilingStrategyExtension;
+import org.eclipse.swt.widgets.Shell;
+
+
+
+public class WikiReconcilingStrategy implements IReconcilingStrategy, IReconcilingStrategyExtension {
+
+ private WikiEditor fEditor;
+ private IDocument fDocument;
+ private IProgressMonitor fProgressMonitor;
+
+ private WikipediaOutlineParser fParser;
+ private WikiFoldingStructureProvider fFoldingStructureProvider;
+
+ public WikiReconcilingStrategy(WikiEditor editor) {
+ fEditor= editor;
+ fParser= new WikipediaOutlineParser();
+ fFoldingStructureProvider= new WikiFoldingStructureProvider(editor);
+ }
+
+ public void setDocument(IDocument document) {
+ fDocument= document;
+ fFoldingStructureProvider.setDocument(fDocument);
+ }
+
+ public void setProgressMonitor(IProgressMonitor monitor) {
+ fProgressMonitor= monitor;
+ fFoldingStructureProvider.setProgressMonitor(fProgressMonitor);
+ }
+
+ public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
+ reconcile();
+ }
+
+ public void reconcile(IRegion partition) {
+ reconcile();
+ }
+
+ public void initialReconcile() {
+ reconcile();
+ }
+
+ private void reconcile() {
+ final WikipediaSection section= fParser.parse(fDocument);
+ if (section == null)
+ return;
+
+ Shell shell= fEditor.getSite().getShell();
+ if (shell == null || shell.isDisposed())
+ return;
+
+ shell.getDisplay().asyncExec(new Runnable() {
+ public void run() {
+ fEditor.setSection(section);
+ }
+ });
+ fFoldingStructureProvider.updateFoldingRegions(section);
+ }
+}
--- /dev/null
+/***********************************************************************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ **********************************************************************************************************************************/
+package net.sourceforge.phpeclipse.wiki.editor;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.RGB;
+
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.TextAttribute;
+import org.eclipse.jface.text.contentassist.ContentAssistant;
+import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
+import org.eclipse.jface.text.contentassist.IContentAssistant;
+import org.eclipse.jface.text.presentation.IPresentationReconciler;
+import org.eclipse.jface.text.presentation.PresentationReconciler;
+import org.eclipse.jface.text.reconciler.IReconciler;
+import org.eclipse.jface.text.reconciler.MonoReconciler;
+import org.eclipse.jface.text.rules.DefaultDamagerRepairer;
+import org.eclipse.jface.text.rules.IRule;
+import org.eclipse.jface.text.rules.IToken;
+import org.eclipse.jface.text.rules.ITokenScanner;
+import org.eclipse.jface.text.rules.IWordDetector;
+import org.eclipse.jface.text.rules.RuleBasedScanner;
+import org.eclipse.jface.text.rules.SingleLineRule;
+import org.eclipse.jface.text.rules.Token;
+import org.eclipse.jface.text.rules.WordRule;
+import org.eclipse.jface.text.source.IAnnotationHover;
+import org.eclipse.jface.text.source.ISharedTextColors;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.SourceViewerConfiguration;
+
+public class WikiSourceViewerConfiguration extends SourceViewerConfiguration {
+
+ /**
+ * A no-op implementation of <code>IAnnotationHover</code> that will trigger the text editor to set up annotation hover support.
+ */
+ private static final class NullHover implements IAnnotationHover {
+
+ /*
+ * @see org.eclipse.jface.text.source.IAnnotationHover#getHoverInfo(org.eclipse.jface.text.source.ISourceViewer, int)
+ */
+ public String getHoverInfo(ISourceViewer sourceViewer, int lineNumber) {
+ return null;
+ }
+ }
+
+ /**
+ * Simple word detector that detects any sequence of non-whitespace as a word.
+ */
+ private static final class SimpleWordDetector implements IWordDetector {
+ /*
+ * @see org.eclipse.jface.text.rules.IWordDetector#isWordStart(char)
+ */
+ public boolean isWordStart(char c) {
+ return isWordPart(c);
+ }
+
+ /*
+ * @see org.eclipse.jface.text.rules.IWordDetector#isWordPart(char)
+ */
+ public boolean isWordPart(char c) {
+ return !Character.isWhitespace(c);
+ }
+ }
+
+ private static final class SimpleListDetector implements IWordDetector {
+ /*
+ * @see org.eclipse.jface.text.rules.IWordDetector#isWordStart(char)
+ */
+ public boolean isWordStart(char c) {
+ return c == '*' || c == '#';
+ }
+
+ /*
+ * @see org.eclipse.jface.text.rules.IWordDetector#isWordPart(char)
+ */
+ public boolean isWordPart(char c) {
+ return true;
+ }
+ }
+
+ private final ISharedTextColors fColors;
+
+ private WikiEditor fEditor;
+
+ public WikiSourceViewerConfiguration(WikiEditor editor, ISharedTextColors colors) {
+ fEditor = editor;
+ fColors = colors;
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getPresentationReconciler(org.eclipse.jface.text.source.ISourceViewer)
+ */
+ public IPresentationReconciler getPresentationReconciler(ISourceViewer sourceViewer) {
+ PresentationReconciler reconciler = new PresentationReconciler();
+ DefaultDamagerRepairer dr = new DefaultDamagerRepairer(getRecipeScanner());
+ reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
+ reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
+ return reconciler;
+ }
+
+ private ITokenScanner getRecipeScanner() {
+ RuleBasedScanner scanner = new RuleBasedScanner();
+
+ IRule[] rules = new IRule[11];
+ rules[0] = createHeader6Rule();
+ rules[1] = createHeader5Rule();
+ rules[2] = createHeader4Rule();
+ rules[3] = createHeader3Rule();
+ rules[4] = createHeader2Rule();
+ rules[5] = createHeader1Rule();
+ rules[6] = createHRRule();
+ rules[7] = createLinkRule();
+ rules[8] = createExternalHTTPRule();
+ rules[9] = createListRule();
+ rules[10] = createNumberedListRule();
+
+ scanner.setRules(rules);
+ return scanner;
+ }
+
+ // private IRule createSectionTitleRule() {
+ // IToken titleToken= new Token(new TextAttribute(null, null, SWT.BOLD));
+ // WordRule wordRule= new WordRule(new SimpleWordDetector());
+ // wordRule.addWord(IngredientsSection.TITLE + ":", titleToken);
+ // wordRule.addWord(PreparationSection.TITLE + ":", titleToken);
+ // return wordRule;
+ // }
+
+ private IRule createHRRule() {
+ IToken quantityToken = new Token(new TextAttribute(fColors.getColor(new RGB(0, 0, 140)), null, SWT.ITALIC));
+ SingleLineRule singleLineRule = new SingleLineRule("----", "\n", quantityToken);
+ singleLineRule.setColumnConstraint(0);
+ return singleLineRule;
+ }
+
+ private IRule createHeader1Rule() {
+ IToken quantityToken = new Token(new TextAttribute(fColors.getColor(new RGB(0, 0, 140)), null, SWT.ITALIC));
+ SingleLineRule singleLineRule = new SingleLineRule("=", "=", quantityToken);
+ singleLineRule.setColumnConstraint(0);
+ return singleLineRule;
+ }
+
+ private IRule createHeader2Rule() {
+ IToken quantityToken = new Token(new TextAttribute(fColors.getColor(new RGB(0, 0, 140)), null, SWT.ITALIC));
+ SingleLineRule singleLineRule = new SingleLineRule("==", "==", quantityToken);
+ singleLineRule.setColumnConstraint(0);
+ return singleLineRule;
+ }
+
+ private IRule createHeader3Rule() {
+ IToken quantityToken = new Token(new TextAttribute(fColors.getColor(new RGB(0, 0, 140)), null, SWT.ITALIC));
+ SingleLineRule singleLineRule = new SingleLineRule("===", "===", quantityToken);
+ singleLineRule.setColumnConstraint(0);
+ return singleLineRule;
+ }
+
+ private IRule createHeader4Rule() {
+ IToken quantityToken = new Token(new TextAttribute(fColors.getColor(new RGB(0, 0, 140)), null, SWT.ITALIC));
+ SingleLineRule singleLineRule = new SingleLineRule("====", "====", quantityToken);
+ singleLineRule.setColumnConstraint(0);
+ return singleLineRule;
+ }
+
+ private IRule createHeader5Rule() {
+ IToken quantityToken = new Token(new TextAttribute(fColors.getColor(new RGB(0, 0, 140)), null, SWT.ITALIC));
+ SingleLineRule singleLineRule = new SingleLineRule("=====", "=====", quantityToken);
+ singleLineRule.setColumnConstraint(0);
+ return singleLineRule;
+ }
+
+ private IRule createHeader6Rule() {
+ IToken quantityToken = new Token(new TextAttribute(fColors.getColor(new RGB(0, 0, 140)), null, SWT.ITALIC));
+ SingleLineRule singleLineRule = new SingleLineRule("======", "======", quantityToken);
+ singleLineRule.setColumnConstraint(0);
+ return singleLineRule;
+ }
+
+ // private IRule createLeadingDashRule() {
+ // IToken dashToken= new Token(new TextAttribute(fColors.getColor(new RGB(200, 100, 100)), null, SWT.BOLD));
+ // WordRule wordRule= new WordRule(new SimpleWordDetector());
+ // wordRule.addWord("-", dashToken);
+ // wordRule.setColumnConstraint(0);
+ // return wordRule;
+ // }
+
+ private IRule createListRule() {
+ IToken dashToken = new Token(new TextAttribute(fColors.getColor(new RGB(63, 127, 95)), null, SWT.BOLD));
+ // WordRule wordRule= new WordRule(new SimpleListDetector());
+ // wordRule.addWord("*", dashToken);
+ SingleLineRule singleLineRule = new SingleLineRule("*", "\n", dashToken);
+ singleLineRule.setColumnConstraint(0);
+ return singleLineRule;
+ }
+
+ private IRule createNumberedListRule() {
+ IToken dashToken = new Token(new TextAttribute(fColors.getColor(new RGB(63, 127, 95)), null, SWT.BOLD));
+ // WordRule wordRule= new WordRule(new SimpleListDetector());
+ // wordRule.addWord("#", dashToken);
+ SingleLineRule singleLineRule = new SingleLineRule("#", "\n", dashToken);
+ singleLineRule.setColumnConstraint(0);
+ return singleLineRule;
+ }
+
+ private IRule createLinkRule() {
+ IToken stepToken = new Token(new TextAttribute(fColors.getColor(new RGB(200, 100, 100)), null, SWT.BOLD));
+ SingleLineRule stepRule = new SingleLineRule("[[", "]]", stepToken);
+ // stepRule.setColumnConstraint(0);
+ return stepRule;
+ }
+
+ private IRule createExternalHTTPRule() {
+ IToken stepToken = new Token(new TextAttribute(fColors.getColor(new RGB(200, 100, 100)), null, SWT.BOLD));
+ SingleLineRule stepRule = new SingleLineRule("[http", "]", stepToken);
+ // stepRule.setColumnConstraint(0);
+ return stepRule;
+ }
+
+ /*
+ * @see SourceViewerConfiguration#getReconciler(ISourceViewer)
+ */
+ public IReconciler getReconciler(ISourceViewer sourceViewer) {
+ WikiReconcilingStrategy strategy = new WikiReconcilingStrategy(fEditor);
+ MonoReconciler reconciler = new MonoReconciler(strategy, false);
+ reconciler.setProgressMonitor(new NullProgressMonitor());
+ reconciler.setDelay(500);
+
+ return reconciler;
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getContentAssistant(org.eclipse.jface.text.source.ISourceViewer)
+ */
+ public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {
+ ContentAssistant assistant = new ContentAssistant();
+
+ IContentAssistProcessor processor = new WikiCompletionProcessor(fEditor);
+ assistant.setContentAssistProcessor(processor, IDocument.DEFAULT_CONTENT_TYPE);
+
+ assistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_ABOVE);
+ assistant.setInformationControlCreator(getInformationControlCreator(sourceViewer));
+ assistant.enableAutoInsert(true);
+
+ return assistant;
+ }
+
+ /*
+ * @see org.eclipse.jface.text.source.SourceViewerConfiguration#getAnnotationHover(org.eclipse.jface.text.source.ISourceViewer)
+ */
+ public IAnnotationHover getAnnotationHover(ISourceViewer sourceViewer) {
+ return new NullHover();
+ }
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package net.sourceforge.phpeclipse.wiki.editor.action;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditor;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.TextEditorAction;
+
+
+public class WeblogWikiAction extends TextEditorAction {
+
+ private boolean fForward;
+
+ public WeblogWikiAction(String prefix, boolean forward) {
+ super(WikiEditorPlugin.getDefault().getResourceBundle(), prefix, null);
+ }
+
+ public void run() {
+
+ }
+
+ public void setEditor(ITextEditor editor) {
+ if (editor instanceof WikiEditor)
+ super.setEditor(editor);
+ update();
+ }
+
+ public void update() {
+ setEnabled(getTextEditor() instanceof WikiEditor);
+ }
+}
--- /dev/null
+/***********************************************************************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ **********************************************************************************************************************************/
+package net.sourceforge.phpeclipse.wiki.editor.model;
+
+import java.util.Stack;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IRegion;
+
+public class WikipediaOutlineParser {
+
+ private IDocument fDocument;
+
+ /**
+ * Next line to read.
+ */
+ private int fLine;
+
+ private int fLineCount;
+
+ public WikipediaSection parse(IDocument document) {
+ try {
+ fDocument = document;
+ fLine = 0;
+ fLineCount = fDocument.getNumberOfLines();
+ return parseWikipediaText();
+ } catch (BadLocationException e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ private WikipediaSection parseWikipediaText() throws BadLocationException {
+ Stack stack = new Stack();
+ char ch;
+ WikipediaText wikiText = new WikipediaText();
+ WikipediaSection section;
+ // int startOffset = -1;
+ String textString;
+ String headerString = null;
+ char[] text;
+ IRegion region = null;
+ int headerStartOffset;
+ int headerEndOffset;
+ int headerLevelCounter;
+
+ while (fLine < fLineCount) {
+ region = fDocument.getLineInformation(fLine);
+ textString = fDocument.get(region.getOffset(), region.getLength());
+ text = textString.toCharArray();
+ fLine++;
+
+ headerStartOffset = 0;
+ if (text.length >= 2 && text[headerStartOffset++] == '=') {
+ headerEndOffset = text.length;
+ while (headerEndOffset > 0 && Character.isWhitespace(text[--headerEndOffset])) {
+ //
+ }
+ if (text[headerEndOffset] == '=') {
+ // header section
+ while (headerStartOffset < text.length && headerStartOffset < 6 && text[headerStartOffset++] == '=') {
+ //
+ }
+ headerLevelCounter = 1;
+ while (headerEndOffset > 0 && headerLevelCounter < headerStartOffset && text[--headerEndOffset] == '=') {
+ headerLevelCounter++;
+ }
+
+ // if (!stack.isEmpty()) {
+ // section = (WikipediaSection) stack.pop();
+ // section.setLength(region.getOffset() - section.getOffset() - 1);
+ // wikiText.add(section);
+ // }
+
+ // headerString = new String(text, headerStartOffset - 1, headerEndOffset - headerStartOffset + 2);
+ // stack.push(new WikipediaSection(wikiText, headerString, headerLevelCounter, region.getOffset(), 1));
+ if (headerStartOffset > 0 && (headerEndOffset - headerStartOffset + 2 > 0)) {
+ headerString = new String(text, headerStartOffset - 1, headerEndOffset - headerStartOffset + 2);
+ addSection(wikiText, new WikipediaSection(wikiText, headerString, headerLevelCounter, region.getOffset(), 1), stack,
+ region);
+
+ }
+
+ }
+ }
+ }
+ if (!stack.isEmpty()) {
+ reduceSection(wikiText, stack, region);
+ // section = (WikipediaSection) stack.pop();
+ // section.setLength(region.getOffset() - section.getOffset() - 1);
+ // wikiText.add(section);
+ }
+ return wikiText;
+ }
+
+ private void addSection(WikipediaSection wikiText, WikipediaSection currentSection, Stack stack, IRegion region) {
+ int level = currentSection.getHeaderLevel();
+ while (!stack.isEmpty()) {
+ WikipediaSection section = (WikipediaSection) stack.peek();
+ if (section.getHeaderLevel() < level) {
+ currentSection.setParent(section);
+ section.add(currentSection);
+ stack.push(currentSection);
+ return;
+ } else { // if (section.getHeaderLevel() <= level) {
+ stack.pop();
+ section.setLength(region.getOffset() - section.getOffset() - 1);
+ }
+ }
+ currentSection.setParent(wikiText);
+ wikiText.add(currentSection);
+ stack.push(currentSection);
+ }
+
+ private void reduceSection(WikipediaSection wikiText, Stack stack, IRegion region) {
+ while (!stack.isEmpty()) {
+ WikipediaSection section = (WikipediaSection) stack.peek();
+ stack.pop();
+ section.setLength(region.getOffset() - section.getOffset() - 1);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+/***********************************************************************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others. All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors: IBM Corporation - initial API and implementation
+ **********************************************************************************************************************************/
+package net.sourceforge.phpeclipse.wiki.editor.model;
+
+import java.util.ArrayList;
+
+public class WikipediaSection {
+ protected static WikipediaSection[] NO_CHILDREN = new WikipediaSection[0];
+
+ private WikipediaSection fParent;
+
+ private String fName;
+
+ private int fOffset;
+ private int fLength;
+ private int fheaderLevel;
+ protected ArrayList recipeElements;
+
+ WikipediaSection(WikipediaSection parent, String name, int level, int offset, int length) {
+ fParent = parent;
+ fName = name;
+ fheaderLevel = level;
+ fOffset = offset;
+ fLength = length;
+ recipeElements = new ArrayList();
+ }
+
+
+ public Object[] getChildren() {
+ return recipeElements.toArray();
+ }
+
+ public String getName() {
+ return fName;
+ }
+
+ public int getOffset() {
+ return fOffset;
+ }
+
+ public int getLength() {
+ return fLength;
+ }
+
+ /**
+ * @param index
+ * @param element
+ */
+ public void add(int index, WikipediaSection element) {
+ recipeElements.add(index, element);
+ }
+
+ /**
+ * @param o
+ * @return
+ */
+ public boolean add(WikipediaSection o) {
+ return recipeElements.add(o);
+ }
+
+ /**
+ * @param index
+ * @return
+ */
+ public WikipediaSection get(int index) {
+ return (WikipediaSection) recipeElements.get(index);
+ }
+
+ /**
+ * @return
+ */
+ public int size() {
+ return recipeElements.size();
+ }
+
+ /**
+ * @param length The length to set.
+ */
+ public void setLength(int length) {
+ fLength = length;
+ }
+
+ /**
+ * @param offset The fOffset to set.
+ */
+ public void setoffset(int offset) {
+ fOffset = offset;
+ }
+ /**
+ * @return Returns the headerLevel.
+ */
+ public int getHeaderLevel() {
+ return fheaderLevel;
+ }
+ /**
+ * @param fheaderLevel The headerLevel to set.
+ */
+ public void setHeaderLevel(int fheaderLevel) {
+ this.fheaderLevel = fheaderLevel;
+ }
+ /**
+ * @return Returns the parent.
+ */
+ public WikipediaSection getParent() {
+ return fParent;
+ }
+ /**
+ * @param parent The parent to set.
+ */
+ public void setParent(WikipediaSection parent) {
+ fParent = parent;
+ }
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.wiki.editor.model;
+
+import java.util.ArrayList;
+
+public class WikipediaText extends WikipediaSection {
+
+
+ WikipediaText() {
+ super(null, null, -1, -1, -1);
+ }
+
+
+}
--- /dev/null
+/*
+ * Copyright (c) 2002 Team in a Box Ltd. All rights reserved. This file is made available under the terms and conditions of the
+ * Common Public License v 1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/cpl-v1.0.html
+ *
+ * Contributors: Team in a Box Ltd http://www.teaminabox.co.uk/
+ */
+
+package net.sourceforge.phpeclipse.wiki.export;
+
+import java.io.File;
+import java.lang.reflect.InvocationTargetException;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+public final class WikiExportWizard extends Wizard implements INewWizard {
+ static final QualifiedName DIRECTORY_QUALIFIED_NAME = new QualifiedName(WikiEditorPlugin.PLUGIN_ID, "exportDirectory");
+
+ private WikiExportWizardPage page;
+
+ private ISelection selection;
+
+ public WikiExportWizard() {
+ super();
+ setNeedsProgressMonitor(true);
+ }
+
+ public void addPages() {
+ page = new WikiExportWizardPage(selection);
+ addPage(page);
+ }
+
+ public boolean performFinish() {
+ persistExportProperties();
+
+ final IContainer folder = page.getFolder();
+ final String exportDirectory = page.getExportDirectoryPath();
+
+ return runOperationForContainer(new IRunnableWithProgress() {
+ public void run(IProgressMonitor monitor) throws InvocationTargetException {
+ try {
+ startExport(monitor, folder, exportDirectory);
+ } catch (Exception e) {
+ throw new InvocationTargetException(e);
+ } finally {
+ monitor.done();
+ }
+ }
+ });
+ }
+
+ private boolean runOperationForContainer(IRunnableWithProgress op) {
+ try {
+ getContainer().run(true, true, op);
+ } catch (InterruptedException e) {
+ return false;
+ } catch (InvocationTargetException e) {
+ WikiEditorPlugin.getDefault().log("", e);
+ MessageDialog.openError(getShell(), "Error", e.getTargetException().getMessage());
+ return false;
+ }
+
+ return true;
+ }
+
+ private void startExport(IProgressMonitor monitor, IContainer folder, String exportDirectory) throws CoreException {
+ try {
+ final String srcBasePath = Util.getWikiTextsPath(folder);
+ new WikiExporter().export(folder, exportDirectory, srcBasePath, monitor);
+ } catch (Exception ioex) {
+ throw new CoreException(new Status(IStatus.ERROR, "Failed to write Wiki Documents", IStatus.OK, ioex.getMessage(), ioex));
+ }
+ }
+
+ private void persistExportProperties() {
+ IProject project = page.getFolder().getProject();
+ try {
+ project.setPersistentProperty(WikiExportWizard.DIRECTORY_QUALIFIED_NAME, new File(page.getExportDirectoryPath())
+ .getAbsolutePath());
+ } catch (CoreException cex) {
+ noteException(cex);
+ }
+ }
+
+ private void noteException(CoreException cex) {
+ WikiEditorPlugin.getDefault().log("Export Error", cex);
+ throw new RuntimeException("An error occurred. Please see the log for details.");
+ }
+
+ public void init(IWorkbench workbench, IStructuredSelection selection) {
+ this.selection = selection;
+ }
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2002 Team in a Box Ltd. All rights reserved. This file is made available under the terms and conditions of the
+ * Common Public License v 1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/cpl-v1.0.html
+ *
+ * Contributors: Team in a Box Ltd http://www.teaminabox.co.uk/
+ */
+
+package net.sourceforge.phpeclipse.wiki.export;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.preference.StringFieldEditor;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.dialogs.ContainerSelectionDialog;
+
+public final class WikiExportWizardPage extends WizardPage implements IPropertyChangeListener, SelectionListener {
+ private StringFieldEditor folderText;
+
+ private StringFieldEditor exportDirectoryText;
+
+ private ISelection selection;
+
+ public WikiExportWizardPage(ISelection selection) {
+ super(WikiEditorPlugin.getResourceString("Export.wizardTitle"));
+ setTitle(WikiEditorPlugin.getResourceString("Export.wizardTitle"));
+ setDescription(WikiEditorPlugin.getResourceString("Export.wizardDescription"));
+ this.selection = selection;
+ }
+
+ public void createControl(Composite parent) {
+ Composite rootComposite = createControlsContainer(parent);
+
+ try {
+ initialize();
+ } catch (RuntimeException rex) {
+ throw rex;
+ } catch (CoreException cex) {
+ WikiEditorPlugin.getDefault().log("", cex);
+ throw new RuntimeException("Caught CoreException. See log for details.");
+ }
+ dialogChanged();
+ setControl(rootComposite);
+ }
+
+ private Composite createControlsContainer(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.verticalSpacing = 20;
+ container.setLayout(layout);
+ container.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
+
+ createCommonControls(container);
+ return container;
+ }
+
+ private void createCommonControls(Composite parent) {
+ Composite container = new Composite(parent, SWT.NULL);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 3;
+ layout.verticalSpacing = 9;
+ container.setLayout(layout);
+ container.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
+
+ createFolderControls(container);
+ createExportDirectoryControls(container);
+ }
+
+ private void createExportDirectoryControls(Composite container) {
+ exportDirectoryText = addStringFieldEditor(container, WikiEditorPlugin.getResourceString("Export.wizardExportDirectory"));
+
+ Button button = new Button(container, SWT.PUSH);
+ button.setText(WikiEditorPlugin.getResourceString("Export.wizardBrowse"));
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ handleBrowseHtmlExportLocation();
+ }
+ });
+ }
+
+ private void createFolderControls(Composite container) {
+ folderText = addStringFieldEditor(container, WikiEditorPlugin.getResourceString("Export.wizardFolder"));
+
+ Button button = new Button(container, SWT.PUSH);
+ button.setText(WikiEditorPlugin.getResourceString("Export.wizardBrowse"));
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ handleBrowseFolders();
+ } catch (CoreException cex) {
+ WikiEditorPlugin.getDefault().log("", cex);
+ throw new RuntimeException("Caught CoreException. See log for details.");
+ }
+ }
+ });
+ }
+
+ private StringFieldEditor addStringFieldEditor(Composite container, String labelText) {
+ Label label = new Label(container, SWT.NULL);
+ label.setText(labelText);
+
+ Composite editorComposite = new Composite(container, SWT.NULL);
+ editorComposite.setLayout(new GridLayout());
+ editorComposite.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
+ StringFieldEditor editor = new StringFieldEditor("", "", editorComposite);
+
+ editor.setPropertyChangeListener(this);
+
+ return editor;
+ }
+
+ private void initialize() throws CoreException {
+ if (selection == null || selection.isEmpty() || !(selection instanceof IStructuredSelection)) {
+ return;
+ }
+
+ IStructuredSelection ssel = (IStructuredSelection) selection;
+ if (ssel.size() == 1) {
+ initialiseFromSelectedObject(ssel.getFirstElement());
+ }
+ }
+
+ private void initialiseFromSelectedObject(Object obj) throws CoreException {
+ if (obj instanceof IFolder || obj instanceof IProject) {
+ initialiseFolder(((IResource) obj));
+ }
+ }
+
+ private void initialiseFolder(IResource resource) throws CoreException {
+ folderText.setStringValue(resource.getFullPath().toString());
+ initialiseExportDirectoryText(resource);
+ }
+
+ private void initialiseExportDirectoryText(IResource resource) throws CoreException {
+ String exportDir = resource.getProject().getPersistentProperty(WikiExportWizard.DIRECTORY_QUALIFIED_NAME);
+ if (exportDir != null) {
+ exportDirectoryText.setStringValue(exportDir);
+ } else {
+ exportDirectoryText.setStringValue("");
+ }
+ }
+
+ private void handleBrowseHtmlExportLocation() {
+ DirectoryDialog dialog = new DirectoryDialog(getShell(), SWT.SINGLE | SWT.OPEN);
+ String path = dialog.open();
+ if (path != null) {
+ exportDirectoryText.setStringValue(path);
+ }
+ }
+
+ private void handleBrowseFolders() throws CoreException {
+ ContainerSelectionDialog dialog = new ContainerSelectionDialog(getShell(), ResourcesPlugin.getWorkspace().getRoot(), false,
+ WikiEditorPlugin.getResourceString("Export.wizardSelectFolder"));
+ if (dialog.open() == Window.OK) {
+ Object[] result = dialog.getResult();
+ if (result != null && result.length == 1) {
+ IResource resource = ResourcesPlugin.getWorkspace().getRoot().findMember((IPath) result[0]);
+ if (resource instanceof IFile) {
+ return;
+ }
+ initialiseFolder(resource);
+ }
+ }
+ }
+
+ private void dialogChanged() {
+ if (getFolderText().length() == 0) {
+ updateStatus("Folder must be specified");
+ } else if (getExportDirectoryPath().length() == 0) {
+ updateStatus("Directory must be specified");
+ } else {
+ updateStatus(null);
+ }
+ }
+
+ private void updateStatus(String message) {
+ setErrorMessage(message);
+ setPageComplete(message == null);
+ }
+
+ public String getExportDirectoryPath() {
+ return exportDirectoryText.getStringValue();
+ }
+
+ public void propertyChange(PropertyChangeEvent event) {
+ dialogChanged();
+ }
+
+ public void widgetSelected(SelectionEvent e) {
+ dialogChanged();
+ }
+
+ public void widgetDefaultSelected(SelectionEvent e) {
+ dialogChanged();
+ }
+
+ String getFolderText() {
+ return folderText.getStringValue();
+ }
+
+ public IContainer getFolder() {
+ return (IContainer) ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(getFolderText()));
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.export;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.MappedByteBuffer;
+import java.nio.channels.FileChannel;
+import java.util.TreeSet;
+
+import net.sourceforge.phpeclipse.wiki.builder.CreatePageAction;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+
+import de.java2html.converter.JavaSource2HTMLConverter;
+import de.java2html.javasource.JavaSource;
+import de.java2html.javasource.JavaSourceParser;
+import de.java2html.options.Java2HtmlConversionOptions;
+
+public final class WikiExporter {
+
+ public static final String HTML_EXTENSION = ".html";
+
+ public static final String WORKSPACE = "workspace";
+
+ // private File exportDirectory;
+
+ // private ExportLinkMaker exportLinkMaker;
+ private TreeSet index;
+
+ public WikiExporter() {
+ // exportLinkMaker = new ExportLinkMaker();
+ index = new TreeSet(String.CASE_INSENSITIVE_ORDER);
+ }
+
+ public void export(IContainer folder, String exportDirectoryName, String srcBasePath, IProgressMonitor monitor) throws IOException, CoreException,
+ InstantiationException, IllegalAccessException, ClassNotFoundException {
+ // exportDirectory = new File(exportDirectoryName);
+ IResource[] resources = folder.members(IResource.FILE);
+// monitor.beginTask(WikiEditorPlugin.getResourceString("Export.wikiPages"), resources.length + 1);
+ for (int i = 0; i < resources.length; i++) {
+ if (resources[i] instanceof IFile) {
+ monitor.subTask(WikiEditorPlugin.getResourceString("Export.exportFile")+resources[i].getLocation());
+ CreatePageAction.createPage((IFile) resources[i], exportDirectoryName, srcBasePath);
+ monitor.worked(1);
+ } else if (resources[i] instanceof IFolder) {
+ monitor.subTask(WikiEditorPlugin.getResourceString("Export.exportFolder")+resources[i].getLocation());
+ export((IFolder) resources[i], exportDirectoryName, srcBasePath, monitor);
+ monitor.worked(1);
+ }
+ }
+ // monitor.subTask(WikiEditorPlugin.getResourceString("Export.linkedResources"));
+ // exportLinkedResources();
+ // createIndex();
+// monitor.worked(1);
+ }
+
+ /**
+ * TODO: This is a horrible hack for a quick solution.
+ */
+ // private void createIndex() throws IOException {
+ // File indexFile = createHtmlFile("index");
+ //
+ // PrintWriter writer = new PrintWriter(new FileWriter(indexFile));
+ // writer.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
+ // writer.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">");
+ // writer.println("<html>");
+ // writer.println(" <head>");
+ // writer.print(" <title>Index</title>");
+ // writer.println(" </head>");
+ // writer.println(" <body>");
+ //
+ // Iterator iterator = index.iterator();
+ // while (iterator.hasNext()) {
+ // String name = (String) iterator.next();
+ // writer.print(" <br/>");
+ // writer.println("<a href=\"" + name + ".html\">" + name + "</a>");
+ // }
+ //
+ // writer.println(" </body>");
+ // writer.println(" </html>");
+ // writer.flush();
+ // writer.close();
+ // }
+ // private void exportLinkedResources() throws IOException {
+ // if (!exportLinkMaker.hasLinkedDocuments()) {
+ // return;
+ // }
+ // File workspaceExport = new File(exportDirectory, WikiExporter.WORKSPACE);
+ // if (!workspaceExport.exists()) {
+ // workspaceExport.mkdir();
+ // }
+ // HashMap map = exportLinkMaker.getLinkedResources();
+ // Iterator iterator = map.keySet().iterator();
+ // while (iterator.hasNext()) {
+ // IResource resource = (IResource) iterator.next();
+ // String location = (String) map.get(resource);
+ // export(resource, location);
+ // }
+ // }
+ // private void export(IResource resource, String location) throws IOException {
+ // File destination = new File(exportDirectory, location);
+ //
+ // if (destination.isDirectory()) {
+ // return;
+ // }
+ // if (!destination.exists()) {
+ // destination.getParentFile().mkdirs();
+ // }
+ // File source = new File(resource.getLocation().toString());
+ // if (isJavaResource(resource)) {
+ // javaToHtml(source, new File(destination.getParentFile(), destination.getName()));
+ // } else {
+ // copy(source, destination);
+ // }
+ // }
+ private boolean isJavaResource(IResource resource) {
+ return "java".equals(resource.getFileExtension());
+ }
+
+ private void javaToHtml(File source, File destination) throws IOException {
+ JavaSource java = new JavaSourceParser().parse(new FileReader(source));
+ JavaSource2HTMLConverter converter = new JavaSource2HTMLConverter(java);
+ Java2HtmlConversionOptions options = Java2HtmlConversionOptions.getDefault();
+ options.setShowLineNumbers(true);
+ options.setShowFileName(true);
+ options.setShowJava2HtmlLink(true);
+ converter.setConversionOptions(options);
+ FileWriter writer = new FileWriter(destination);
+ converter.convert(writer);
+ writer.flush();
+ writer.close();
+ }
+
+ private void copy(File source, File dest) throws IOException {
+ FileChannel in = null;
+ FileChannel out = null;
+ try {
+ in = new FileInputStream(source).getChannel();
+ out = new FileOutputStream(dest).getChannel();
+ long size = in.size();
+ MappedByteBuffer buf = in.map(FileChannel.MapMode.READ_ONLY, 0, size);
+ out.write(buf);
+ } finally {
+ if (in != null) {
+ in.close();
+ }
+ if (out != null) {
+ out.close();
+ }
+ }
+ }
+
+ private boolean isWikiFile(IResource resource) {
+ return resource instanceof IFile && resource.getFileExtension().equals("wp");
+ }
+
+ // private File createHtmlFile(String name) {
+ // return new File(exportDirectory, name + WikiExporter.HTML_EXTENSION);
+ // }
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.internal;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+
+/**
+ *
+ */
+public class Configuration implements IConfiguration {
+ private static final String MEMENTO_ID = "id";
+ private static final String MEMENTO_USER = "user";
+ private static final String MEMENTO_URL = "url";
+ private static final String MEMENTO_PASSWORD = "password";
+ private static final String MEMENTO_TYPE_ID = "type-id";
+
+ protected String id;
+ protected String fUrl;
+ protected String fPassword;
+ protected String fUser;
+ protected String fType;
+
+ public Configuration() {
+ this( WikiEditorPlugin.HTTP_QUERY ); // default type
+ }
+
+ public Configuration(String type) {
+ this.fType = type;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.monitor.internal.IConfiguration#getId()
+ */
+ public String getId() {
+ return id;
+ }
+
+ public String getURL() {
+ return fUrl;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.monitor.internal.IConfiguration#getRemotePort()
+ */
+ public String getPassword() {
+ return fPassword;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.monitor.internal.IConfiguration#getLocalPort()
+ */
+ public String getUser() {
+ return fUser;
+ }
+
+ /**
+ */
+ public String getType() {
+ return fType;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.monitor.internal.IConfiguration#isRunning()
+ */
+ public boolean isActive() {
+ return ConfigurationManager.getInstance().isActive(this);
+ }
+
+ public void delete() {
+ ConfigurationManager.getInstance().removeConfiguration(this);
+ }
+
+ public boolean isWorkingCopy() {
+ return false;
+ }
+
+ public IConfigurationWorkingCopy getWorkingCopy() {
+ return new ConfigurationWorkingCopy(this);
+ }
+
+ protected void setInternal(IConfiguration monitor) {
+ id = monitor.getId();
+ fUrl = monitor.getURL();
+ fPassword = monitor.getPassword();
+ fUser = monitor.getUser();
+ fType = monitor.getType();
+ }
+
+ protected void save(IMemento memento) {
+ memento.putString(MEMENTO_ID, id);
+ memento.putString(MEMENTO_TYPE_ID, fType);
+ memento.putString(MEMENTO_USER, fUser);
+ memento.putString(MEMENTO_URL, fUrl);
+ memento.putString(MEMENTO_PASSWORD, fPassword);
+ }
+
+ protected void load(IMemento memento) {
+ id = memento.getString(MEMENTO_ID);
+ fType = memento.getString(MEMENTO_TYPE_ID);
+ fUser = memento.getString(MEMENTO_USER);
+ fUrl = memento.getString(MEMENTO_URL);
+ fPassword = memento.getString(MEMENTO_PASSWORD);
+ }
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.internal;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import net.sourceforge.phpeclipse.webbrowser.internal.Trace;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.core.runtime.Preferences;
+/**
+ *
+ */
+public class ConfigurationManager {
+ private static final int ADD = 0;
+ private static final int CHANGE = 1;
+ private static final int REMOVE = 2;
+
+ // configurations
+ protected List configurations;
+ protected Map threads = new HashMap();
+
+ protected List monitorListeners = new ArrayList();
+
+ private Preferences.IPropertyChangeListener pcl;
+ protected boolean ignorePreferenceChanges = false;
+
+ protected static ConfigurationManager instance;
+
+ public static ConfigurationManager getInstance() {
+ if (instance == null)
+ instance = new ConfigurationManager();
+ return instance;
+ }
+
+ private ConfigurationManager() {
+ loadConfigurations();
+
+ pcl = new Preferences.IPropertyChangeListener() {
+ public void propertyChange(Preferences.PropertyChangeEvent event) {
+ if (ignorePreferenceChanges)
+ return;
+ String property = event.getProperty();
+ if (property.equals("configurations")) {
+ loadConfigurations();
+ }
+ }
+ };
+
+ WikiEditorPlugin.getDefault().getPluginPreferences().addPropertyChangeListener(pcl);
+ }
+
+ protected void dispose() {
+ WikiEditorPlugin.getDefault().getPluginPreferences().removePropertyChangeListener(pcl);
+ }
+
+ public IConfigurationWorkingCopy createConfiguration() {
+ return new ConfigurationWorkingCopy();
+ }
+
+ public List getConfigurations() {
+ return new ArrayList(configurations);
+ }
+
+ protected void addConfiguration(IConfiguration configuration) {
+ if (!configurations.contains(configuration))
+ configurations.add(configuration);
+ fireConfigurationEvent(configuration, ADD);
+ saveConfigurations();
+ }
+
+ protected boolean isActive(IConfiguration configuration) {
+ return (threads.get(configuration) != null);
+ }
+
+ protected void removeConfiguration(IConfiguration configuration) {
+ configurations.remove(configuration);
+ fireConfigurationEvent(configuration, REMOVE);
+ saveConfigurations();
+ }
+
+ protected void configurationChanged(IConfiguration configuration) {
+ fireConfigurationEvent(configuration, CHANGE);
+ saveConfigurations();
+ }
+
+ /**
+ * Add monitor listener.
+ *
+ * @param listener
+ */
+ public void addConfigurationListener(IConfigurationListener listener) {
+ monitorListeners.add(listener);
+ }
+
+ /**
+ * Remove monitor listener.
+ *
+ * @param listener
+ */
+ public void removeConfigurationListener(IConfigurationListener listener) {
+ monitorListeners.remove(listener);
+ }
+
+ /**
+ * Fire a monitor event.
+ * @param rr
+ * @param fType
+ */
+ protected void fireConfigurationEvent(IConfiguration monitor, int type) {
+ Object[] obj = monitorListeners.toArray();
+
+ int size = obj.length;
+ for (int i = 0; i < size; i++) {
+ IConfigurationListener listener = (IConfigurationListener) obj[i];
+ if (type == ADD)
+ listener.monitorAdded(monitor);
+ else if (type == CHANGE)
+ listener.monitorChanged(monitor);
+ else if (type == REMOVE)
+ listener.monitorRemoved(monitor);
+ }
+ }
+
+
+
+
+ protected void loadConfigurations() {
+ Trace.trace(Trace.FINEST, "Loading Configurations");
+
+ configurations = new ArrayList();
+ Preferences prefs = WikiEditorPlugin.getDefault().getPluginPreferences();
+ String xmlString = prefs.getString("configurations");
+ if (xmlString != null && xmlString.length() > 0) {
+ try {
+ ByteArrayInputStream in = new ByteArrayInputStream(xmlString.getBytes());
+ IMemento memento = XMLMemento.loadMemento(in);
+
+ IMemento[] children = memento.getChildren("config");
+ if (children != null) {
+ int size = children.length;
+ for (int i = 0; i < size; i++) {
+ Configuration monitor = new Configuration();
+ monitor.load(children[i]);
+ configurations.add(monitor);
+ }
+ }
+ } catch (Exception e) {
+ Trace.trace(Trace.WARNING, "Could not load configurations: " + e.getMessage());
+ }
+ }
+ }
+
+ protected void saveConfigurations() {
+ try {
+ ignorePreferenceChanges = true;
+ XMLMemento memento = XMLMemento.createWriteRoot("configurations");
+
+ Iterator iterator = configurations.iterator();
+ while (iterator.hasNext()) {
+ Configuration monitor = (Configuration) iterator.next();
+ IMemento child = memento.createChild("config");
+ monitor.save(child);
+ }
+
+ String xmlString = memento.saveToString();
+ Preferences prefs = WikiEditorPlugin.getDefault().getPluginPreferences();
+ prefs.setValue("configurations", xmlString);
+ WikiEditorPlugin.getDefault().savePluginPreferences();
+ } catch (Exception e) {
+ Trace.trace(Trace.SEVERE, "Could not save Configurations", e);
+ }
+ ignorePreferenceChanges = false;
+ }
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.internal;
+
+/**
+ *
+ */
+public class ConfigurationWorkingCopy extends Configuration implements IConfigurationWorkingCopy {
+ protected Configuration monitor;
+
+ // creation
+ public ConfigurationWorkingCopy() { }
+
+ // working copy
+ public ConfigurationWorkingCopy(Configuration monitor) {
+ this.monitor = monitor;
+ setInternal(monitor);
+ }
+
+ public void setId(String newId) {
+ id = newId;
+ }
+
+
+ public void setURL(String url) {
+ fUrl = url;
+ }
+
+
+ public void setPassword(String password) {
+ fPassword = password;
+ }
+
+
+ public void setUser(String user) {
+ fUser = user;
+ }
+
+
+ public void setType(String t) {
+ fType = t;
+ }
+
+ public boolean isWorkingCopy() {
+ return true;
+ }
+
+ public IConfigurationWorkingCopy getWorkingCopy() {
+ return this;
+ }
+
+ public IConfiguration save() {
+ ConfigurationManager mm = ConfigurationManager.getInstance();
+ if (monitor != null) {
+ //boolean restart = false;
+// if (monitor.isRunning()) {
+// //restart = true;
+// mm.stopMonitor(monitor);
+// }
+ monitor.setInternal(this);
+ mm.configurationChanged(monitor);
+ //if (restart)
+ // mm.startMonitor(monitor);
+ } else {
+ monitor = new Configuration();
+ monitor.setInternal(this);
+ mm.addConfiguration(monitor);
+ }
+ return monitor;
+ }
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.internal;
+/**
+ *
+ */
+public interface IConfiguration {
+ public String getId();
+
+ public String getURL();
+
+ public String getType();
+
+ public String getPassword();
+
+ public String getUser();
+
+ public IConfigurationWorkingCopy getWorkingCopy();
+
+ public boolean isActive();
+
+ public void delete();
+
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.internal;
+/**
+ *
+ */
+public interface IConfigurationListener {
+ public void monitorAdded(IConfiguration monitor);
+
+ public void monitorChanged(IConfiguration monitor);
+
+ public void monitorRemoved(IConfiguration monitor);
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.internal;
+/**
+ *
+ */
+public interface IConfigurationWorkingCopy extends IConfiguration {
+ public void setId(String id);
+
+ public void setURL(String url);
+
+ public void setPassword(String port);
+
+ public void setUser(String port);
+
+ public void setType(String type);
+
+ public IConfiguration save();
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.internal;
+
+import java.util.List;
+/**
+ * Interface to a memento used for saving the important state of an object
+ * in a form that can be persisted in the file system.
+ * <p>
+ * Mementos were designed with the following requirements in mind:
+ * <ol>
+ * <li>Certain objects need to be saved and restored across platform sessions.
+ * </li>
+ * <li>When an object is restored, an appropriate class for an object might not
+ * be available. It must be possible to skip an object in this case.</li>
+ * <li>When an object is restored, the appropriate class for the object may be
+ * different from the one when the object was originally saved. If so, the
+ * new class should still be able to read the old form of the data.</li>
+ * </ol>
+ * </p>
+ * <p>
+ * Mementos meet these requirements by providing support for storing a
+ * mapping of arbitrary string keys to primitive values, and by allowing
+ * mementos to have other mementos as children (arranged into a tree).
+ * A robust external storage format based on XML is used.
+ * </p><p>
+ * The key for an attribute may be any alpha numeric value. However, the
+ * value of <code>TAG_ID</code> is reserved for internal use.
+ * </p><p>
+ * This interface is not intended to be implemented by clients.
+ * </p>
+ *
+ * @see IPersistableElement
+ * @see IElementFactory
+ */
+public interface IMemento {
+ /**
+ * Special reserved key used to store the memento id
+ * (value <code>"org.eclipse.ui.id"</code>).
+ *
+ * @see #getId
+ */
+ public static final String TAG_ID = "IMemento.internal.id"; //$NON-NLS-1$
+
+ /**
+ * Creates a new child of this memento with the given fType.
+ * <p>
+ * The <code>getChild</code> and <code>getChildren</code> methods
+ * are used to retrieve children of a given fType.
+ * </p>
+ *
+ * @param fType the fType
+ * @return a new child memento
+ * @see #getChild
+ * @see #getChildren
+ */
+ public IMemento createChild(String type);
+
+ /**
+ * Creates a new child of this memento with the given fType and id.
+ * The id is stored in the child memento (using a special reserved
+ * key, <code>TAG_ID</code>) and can be retrieved using <code>getId</code>.
+ * <p>
+ * The <code>getChild</code> and <code>getChildren</code> methods
+ * are used to retrieve children of a given fType.
+ * </p>
+ *
+ * @param fType the fType
+ * @param id the child id
+ * @return a new child memento with the given fType and id
+ * @see #getId
+ */
+ public IMemento createChild(String type, String id);
+
+ /**
+ * Returns the first child with the given fType id.
+ *
+ * @param fType the fType id
+ * @return the first child with the given fType
+ */
+ public IMemento getChild(String type);
+
+ /**
+ * Returns all children with the given fType id.
+ *
+ * @param fType the fType id
+ * @return the list of children with the given fType
+ */
+ public IMemento[] getChildren(String type);
+
+ /**
+ * Returns the floating point value of the given key.
+ *
+ * @param key the key
+ * @return the value, or <code>null</code> if the key was not found or was found
+ * but was not a floating point number
+ */
+ public Float getFloat(String key);
+
+ /**
+ * Returns the id for this memento.
+ *
+ * @return the memento id, or <code>null</code> if none
+ * @see #createChild(java.lang.String,java.lang.String)
+ */
+ public String getId();
+
+ /**
+ * Returns the name for this memento.
+ *
+ * @return the memento name, or <code>null</code> if none
+ * @see #createChild(java.lang.String,java.lang.String)
+ */
+ public String getName();
+
+ /**
+ * Returns the integer value of the given key.
+ *
+ * @param key the key
+ * @return the value, or <code>null</code> if the key was not found or was found
+ * but was not an integer
+ */
+ public Integer getInteger(String key);
+
+ /**
+ * Returns the string value of the given key.
+ *
+ * @param key the key
+ * @return the value, or <code>null</code> if the key was not found or was found
+ * but was not an integer
+ */
+ public String getString(String key);
+
+ /**
+ * Returns the boolean value of the given key.
+ *
+ * @param key the key
+ * @return the value, or <code>null</code> if the key was not found or was found
+ * but was not a boolean
+ */
+ public Boolean getBoolean(String key);
+
+ public List getNames();
+
+ /**
+ * Sets the value of the given key to the given floating point number.
+ *
+ * @param key the key
+ * @param value the value
+ */
+ public void putFloat(String key, float value);
+
+ /**
+ * Sets the value of the given key to the given integer.
+ *
+ * @param key the key
+ * @param value the value
+ */
+ public void putInteger(String key, int value);
+
+ /**
+ * Sets the value of the given key to the given boolean value.
+ *
+ * @param key the key
+ * @param value the value
+ */
+ public void putBoolean(String key, boolean value);
+
+ /**
+ * Copy the attributes and children from <code>memento</code>
+ * to the receiver.
+ *
+ * @param memento the IMemento to be copied.
+ */
+ public void putMemento(IMemento memento);
+
+ /**
+ * Sets the value of the given key to the given string.
+ *
+ * @param key the key
+ * @param value the value
+ */
+ public void putString(String key, String value);
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.internal;
+
+import java.io.*;
+import java.util.*;
+import java.net.URL;
+import org.w3c.dom.*;
+import org.xml.sax.*;
+
+import javax.xml.parsers.*;
+import javax.xml.transform.*;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+/**
+ * A Memento is a class independent container for persistence
+ * info. It is a reflection of 3 storage requirements.
+ *
+ * 1) We need the ability to persist an object and restore it.
+ * 2) The class for an object may be absent. If so we would
+ * like to skip the object and keep reading.
+ * 3) The class for an object may change. If so the new class
+ * should be able to read the old persistence info.
+ *
+ * We could ask the objects to serialize themselves into an
+ * ObjectOutputStream, DataOutputStream, or Hashtable. However
+ * all of these approaches fail to meet the second requirement.
+ *
+ * Memento supports binary persistance with a version ID.
+ */
+public final class XMLMemento implements IMemento {
+ private Document factory;
+ private Element element;
+
+ /**
+ * Answer a memento for the document and element. For simplicity
+ * you should use createReadRoot and createWriteRoot to create the initial
+ * mementos on a document.
+ */
+ public XMLMemento(Document doc, Element el) {
+ factory = doc;
+ element = el;
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public IMemento createChild(String type) {
+ Element child = factory.createElement(type);
+ element.appendChild(child);
+ return new XMLMemento(factory, child);
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public IMemento createChild(String type, String id) {
+ Element child = factory.createElement(type);
+ child.setAttribute(TAG_ID, id);
+ element.appendChild(child);
+ return new XMLMemento(factory, child);
+ }
+
+ /**
+ * Create a Document from a Reader and answer a root memento for reading
+ * a document.
+ */
+ protected static XMLMemento createReadRoot(Reader reader) {
+ Document document = null;
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder parser = factory.newDocumentBuilder();
+ document = parser.parse(new InputSource(reader));
+ Node node = document.getFirstChild();
+ if (node instanceof Element)
+ return new XMLMemento(document, (Element) node);
+ } catch (ParserConfigurationException e) {
+ } catch (IOException e) {
+ } catch (SAXException e) {
+ } finally {
+ try {
+ reader.close();
+ } catch (Exception e) { }
+ }
+ return null;
+ }
+
+ /**
+ * Answer a root memento for writing a document.
+ */
+ public static XMLMemento createWriteRoot(String type) {
+ Document document;
+ try {
+ document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
+ Element element = document.createElement(type);
+ document.appendChild(element);
+ return new XMLMemento(document, element);
+ } catch (ParserConfigurationException e) {
+ throw new Error(e);
+ }
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public IMemento getChild(String type) {
+ // Get the nodes.
+ NodeList nodes = element.getChildNodes();
+ int size = nodes.getLength();
+ if (size == 0)
+ return null;
+
+ // Find the first node which is a child of this node.
+ for (int nX = 0; nX < size; nX ++) {
+ Node node = nodes.item(nX);
+ if (node instanceof Element) {
+ Element element2 = (Element)node;
+ if (element2.getNodeName().equals(type))
+ return new XMLMemento(factory, element2);
+ }
+ }
+
+ // A child was not found.
+ return null;
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public IMemento [] getChildren(String type) {
+ // Get the nodes.
+ NodeList nodes = element.getChildNodes();
+ int size = nodes.getLength();
+ if (size == 0)
+ return new IMemento[0];
+
+ // Extract each node with given fType.
+ ArrayList list = new ArrayList(size);
+ for (int nX = 0; nX < size; nX ++) {
+ Node node = nodes.item(nX);
+ if (node instanceof Element) {
+ Element element2 = (Element)node;
+ if (element2.getNodeName().equals(type))
+ list.add(element2);
+ }
+ }
+
+ // Create a memento for each node.
+ size = list.size();
+ IMemento [] results = new IMemento[size];
+ for (int x = 0; x < size; x ++) {
+ results[x] = new XMLMemento(factory, (Element)list.get(x));
+ }
+ return results;
+ }
+
+ /**
+ * Return the contents of this memento as a byte array.
+ *
+ * @return byte[]
+ */
+ public byte[] getContents() throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ save(out);
+ return out.toByteArray();
+ }
+
+ /**
+ * Returns an input stream for writing to the disk with a local locale.
+ *
+ * @return java.io.InputStream
+ */
+ public InputStream getInputStream() throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ save(out);
+ return new ByteArrayInputStream(out.toByteArray());
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public Float getFloat(String key) {
+ Attr attr = element.getAttributeNode(key);
+ if (attr == null)
+ return null;
+ String strValue = attr.getValue();
+ try {
+ return new Float(strValue);
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public String getId() {
+ return element.getAttribute(TAG_ID);
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public String getName() {
+ return element.getNodeName();
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public Integer getInteger(String key) {
+ Attr attr = element.getAttributeNode(key);
+ if (attr == null)
+ return null;
+ String strValue = attr.getValue();
+ try {
+ return new Integer(strValue);
+ } catch (NumberFormatException e) {
+ return null;
+ }
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public String getString(String key) {
+ Attr attr = element.getAttributeNode(key);
+ if (attr == null)
+ return null;
+ return attr.getValue();
+ }
+
+ public List getNames() {
+ NamedNodeMap map = element.getAttributes();
+ int size = map.getLength();
+ List list = new ArrayList();
+ for (int i = 0; i < size; i++) {
+ Node node = map.item(i);
+ String name = node.getNodeName();
+ list.add(name);
+ }
+ return list;
+ }
+
+ /**
+ * Loads a memento from the given filename.
+ *
+ * @param in java.io.InputStream
+ * @return org.eclipse.ui.IMemento
+ * @exception java.io.IOException
+ */
+ public static IMemento loadMemento(InputStream in) {
+ return createReadRoot(new InputStreamReader(in));
+ }
+
+ /**
+ * Loads a memento from the given filename.
+ *
+ * @param in java.io.InputStream
+ * @return org.eclipse.ui.IMemento
+ * @exception java.io.IOException
+ */
+ public static IMemento loadCorruptMemento(InputStream in) {
+ Document document = null;
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
+ DocumentBuilder parser = factory.newDocumentBuilder();
+ document = parser.parse(in);
+ Node node = document.getFirstChild();
+ if (node instanceof Element)
+ return new XMLMemento(document, (Element) node);
+ } catch (ParserConfigurationException e) {
+ } catch (IOException e) {
+ } catch (SAXException e) {
+ } finally {
+ try {
+ in.close();
+ } catch (Exception e) { }
+ }
+ return null;
+ }
+
+ /**
+ * Loads a memento from the given filename.
+ *
+ * @param filename java.lang.String
+ * @return org.eclipse.ui.IMemento
+ * @exception java.io.IOException
+ */
+ public static IMemento loadMemento(String filename) throws IOException {
+ return XMLMemento.createReadRoot(new FileReader(filename));
+ }
+
+ /**
+ * Loads a memento from the given filename.
+ *
+ * @param url java.net.URL
+ * @return org.eclipse.ui.IMemento
+ * @exception java.io.IOException
+ */
+ public static IMemento loadMemento(URL url) throws IOException {
+ return XMLMemento.createReadRoot(new InputStreamReader(url.openStream()));
+ }
+
+ /**
+ * @see IMemento.
+ */
+ private void putElement(Element element2) {
+ NamedNodeMap nodeMap = element2.getAttributes();
+ int size = nodeMap.getLength();
+ for (int i = 0; i < size; i++){
+ Attr attr = (Attr)nodeMap.item(i);
+ putString(attr.getName(),attr.getValue());
+ }
+
+ NodeList nodes = element2.getChildNodes();
+ size = nodes.getLength();
+ for (int i = 0; i < size; i ++) {
+ Node node = nodes.item(i);
+ if (node instanceof Element) {
+ XMLMemento child = (XMLMemento)createChild(node.getNodeName());
+ child.putElement((Element)node);
+ }
+ }
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public void putFloat(String key, float f) {
+ element.setAttribute(key, String.valueOf(f));
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public void putInteger(String key, int n) {
+ element.setAttribute(key, String.valueOf(n));
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public void putMemento(IMemento memento) {
+ XMLMemento xmlMemento = (XMLMemento) memento;
+ putElement(xmlMemento.element);
+ }
+
+ /**
+ * @see IMemento.
+ */
+ public void putString(String key, String value) {
+ if (value == null)
+ return;
+ element.setAttribute(key, value);
+ }
+
+ /**
+ * Save this Memento to a Writer.
+ */
+ public void save(Writer writer) throws IOException {
+ Result result = new StreamResult(writer);
+ Source source = new DOMSource(factory);
+ try {
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+ transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
+ transformer.transform(source, result);
+ } catch (Exception e) {
+ throw (IOException) (new IOException().initCause(e));
+ }
+ }
+
+ /**
+ * Save this Memento to a Writer.
+ */
+ public void save(OutputStream os) throws IOException {
+ Result result = new StreamResult(os);
+ Source source = new DOMSource(factory);
+ try {
+ Transformer transformer = TransformerFactory.newInstance().newTransformer();
+ transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //$NON-NLS-1$
+ transformer.setOutputProperty(OutputKeys.METHOD, "xml"); //$NON-NLS-1$
+ transformer.transform(source, result);
+ } catch (Exception e) {
+ throw (IOException) (new IOException().initCause(e));
+ }
+ }
+
+ /**
+ * Saves the memento to the given file.
+ *
+ * @param filename java.lang.String
+ * @exception java.io.IOException
+ */
+ public void saveToFile(String filename) throws IOException {
+ Writer w = null;
+ try {
+ w = new FileWriter(filename);
+ save(w);
+ } catch (IOException e) {
+ throw e;
+ } catch (Exception e) {
+ throw new IOException(e.getLocalizedMessage());
+ } finally {
+ if (w != null) {
+ try {
+ w.close();
+ } catch (Exception e) { }
+ }
+ }
+ }
+
+ public String saveToString() throws IOException {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ save(out);
+ return out.toString("UTF-8");
+ }
+
+ /*
+ * @see IMemento#getBoolean(String)
+ */
+ public Boolean getBoolean(String key) {
+ Attr attr = element.getAttributeNode(key);
+ if (attr == null)
+ return null;
+ String strValue = attr.getValue();
+ if ("true".equalsIgnoreCase(strValue))
+ return new Boolean(true);
+ else
+ return new Boolean(false);
+ }
+
+ /*
+ * @see IMemento#putBoolean(String, boolean)
+ */
+ public void putBoolean(String key, boolean value) {
+ element.setAttribute(key, value ? "true" : "false");
+ }
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.wiki.preferences;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.VerifyEvent;
+import org.eclipse.swt.events.VerifyListener;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+public class AlternateUserValidationDialog extends Dialog {
+ String user;
+ String password = ""; //$NON-NLS-1$
+ List numXs = new ArrayList();
+ Label icon1;
+ Label icon2;
+ Label icon3;
+ Label icon4;
+ Text passwordText;
+ boolean inUpdate = false;
+
+ Image[] images;
+
+ public AlternateUserValidationDialog(Shell parentShell, String user) {
+ super(parentShell);
+ this.user = user;
+ initializeImages();
+ }
+
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setText(Messages.bind("AlternateUserValidationDialog.Enter_Password_2")); //$NON-NLS-1$
+ }
+
+ protected Control createContents(Composite parent) {
+ Composite main = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 3;
+ main.setLayout(layout);
+ main.setLayoutData(new GridData(GridData.FILL_BOTH));
+
+ Composite iconComposite = new Composite(main, SWT.NONE);
+ layout = new GridLayout();
+ layout.numColumns = 2;
+ iconComposite.setLayout(layout);
+ iconComposite.setLayoutData(new GridData());
+
+ icon1 = createLabel(iconComposite);
+ icon2 = createLabel(iconComposite);
+ icon3 = createLabel(iconComposite);
+ icon4 = createLabel(iconComposite);
+
+ Composite middleComposite = new Composite(main, SWT.NONE);
+ middleComposite.setLayout(new GridLayout());
+ middleComposite.setLayoutData(new GridData());
+
+ Label l = new Label(middleComposite, SWT.NULL);
+ l.setText(Messages.bind("AlternateUserValidationDialog.message", user)); //$NON-NLS-1$
+ l.setLayoutData(new GridData());
+ l = new Label(middleComposite, SWT.NULL);
+ l.setText(""); //$NON-NLS-1$
+ l.setLayoutData(new GridData());
+ passwordText = new Text(middleComposite, SWT.SINGLE | SWT.BORDER);
+ GridData data = new GridData();
+ data.widthHint = 250;
+ passwordText.setLayoutData(data);
+
+ passwordText.addVerifyListener(new VerifyListener() {
+ public void verifyText(VerifyEvent e) {
+ if (inUpdate) return;
+ e.doit = false;
+ inUpdate = true;
+ switch ((int)e.character) {
+ case 8: {
+ // backspace pressed
+ if (password.length() > 0) {
+ password = password.substring(0, password.length() - 1);
+ }
+ // get rid of bogus Xs
+ int numX = ((Integer)numXs.get(numXs.size() - 1)).intValue();
+ numXs.remove(numXs.size() - 1);
+ String oldText = passwordText.getText();
+ String newText = oldText.substring(0, oldText.length() - numX);
+ passwordText.setText(newText);
+ passwordText.setSelection(newText.length());
+ break;
+ }
+ default: {
+ String oldText = passwordText.getText();
+ String x = getXs();
+ numXs.add(numXs.size(), new Integer(x.length()));
+ String newText = oldText + x;
+ passwordText.setText(newText);
+ passwordText.setSelection(newText.length());
+ password += e.character;
+ }
+ }
+ inUpdate = false;
+ updateImages();
+ }
+ });
+ /*passwordText.addTraverseListener(new TraverseListener() {
+ public void keyTraversed(TraverseEvent e) {
+ switch (e.detail) {
+ case SWT.TRAVERSE_ARROW_NEXT:
+ case SWT.TRAVERSE_ARROW_PREVIOUS:
+ e.detail = SWT.TRAVERSE_NONE;
+ e.doit = false;
+ break;
+ }
+ }
+ });*/
+ Composite buttonComposite = new Composite(main, SWT.NONE);
+ buttonComposite.setLayout(new GridLayout());
+ buttonComposite.setLayoutData(new GridData());
+ Button b = new Button(buttonComposite, SWT.PUSH);
+ b.setText(Messages.bind("AlternateUserValidationDialog.OK_6")); //$NON-NLS-1$
+ data = new GridData();
+ data.widthHint = 70;
+ b.setLayoutData(data);
+ b.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event event) {
+ okPressed();
+ }
+ });
+ buttonComposite.getShell().setDefaultButton(b);
+ b = new Button(buttonComposite, SWT.PUSH);
+ b.setText(Messages.bind("AlternateUserValidationDialog.Cancel_7")); //$NON-NLS-1$
+ data = new GridData();
+ data.widthHint = 70;
+ b.setLayoutData(data);
+ b.addListener(SWT.Selection, new Listener() {
+ public void handleEvent(Event event) {
+ cancelPressed();
+ }
+ });
+ Dialog.applyDialogFont(parent);
+ return main;
+ }
+
+ public boolean close() {
+ boolean result = super.close();
+ if (images != null) {
+ for (int i = 0; i < images.length; i++) {
+ images[i].dispose();
+ images[i] = null;
+ }
+ images = null;
+ }
+ return result;
+ }
+ public String getPassword() {
+ return password;
+ }
+
+ Label createLabel(Composite parent) {
+ Label result = new Label(parent, SWT.NULL);
+ GridData data = new GridData();
+ data.widthHint = 22;
+ data.heightHint = 22;
+ result.setLayoutData(data);
+ result.setImage(getImage());
+ return result;
+ }
+ Image getImage() {
+ double random = Math.random();
+ random *= 7; // Random number between 0.0 and 7.0
+ long num = Math.round(random);
+ return images[(int)num];
+ }
+ void initializeImages() {
+ images = new Image[8];
+ for (int i = 0; i < images.length; i++) {
+ images[i] = WikiEditorPlugin.getDefault().getImageDescriptor("glyphs/glyph" + (i+1) + ".gif").createImage(); //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ FontData fd = new FontData();
+ fd.setStyle(SWT.BOLD);
+ fd.setHeight(10);
+ // On Windows, set the font to Sans Serif for an authentic look
+ if (System.getProperty("os.name").indexOf("Windows") != -1) { //$NON-NLS-1$ //$NON-NLS-2$
+ fd.setName("Microsoft Sans Serif"); //$NON-NLS-1$
+ }
+ }
+ void updateImages() {
+ icon1.setImage(getImage());
+ icon2.setImage(getImage());
+ icon3.setImage(getImage());
+ icon4.setImage(getImage());
+ }
+ public void setUsername(String user) {
+ this.user = user;
+ }
+ String getXs() {
+ double random = Math.random();
+ random *= 2;
+ random += 2;
+ long num = Math.round(random);
+ // Random number between 2 and 4
+ switch ((int)num) {
+ case 2:
+ return "XX"; //$NON-NLS-1$
+ case 3:
+ return "XXX"; //$NON-NLS-1$
+ case 4:
+ return "XXXX"; //$NON-NLS-1$
+ }
+ return "X"; //$NON-NLS-1$
+ }
+ protected void cancelPressed() {
+ password = null;
+ super.cancelPressed();
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2003 Berthold Daum.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * Berthold Daum
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.wiki.preferences;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.preference.FieldEditorPreferencePage;
+import org.eclipse.jface.preference.IPreferenceNode;
+import org.eclipse.jface.preference.IPreferencePage;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.jface.preference.PreferenceNode;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IWorkbenchPropertyPage;
+
+/**
+ */
+public abstract class FieldEditorOverlayPage extends FieldEditorPreferencePage
+ implements
+ IWorkbenchPropertyPage {
+ /**
+ * * Name of resource property for the selection of workbench or project
+ * settings **
+ */
+ public static final String USEPROJECTSETTINGS = "useProjectSettings"; //$NON-NLS-1$
+ private static final String FALSE = "false"; //$NON-NLS-1$
+ private static final String TRUE = "true"; //$NON-NLS-1$
+ private boolean fUseFileSettings = false;
+ // Stores all created field editors
+ private List editors = new ArrayList();
+ // Stores owning element of properties
+ private IAdaptable element;
+ // Additional buttons for property pages
+ private Button useWorkspaceSettingsButton, useProjectSettingsButton,
+ configureButton;
+ // Overlay preference store for property pages
+ private IPreferenceStore overlayStore;
+ // The image descriptor of this pages title image
+ private ImageDescriptor image;
+ // Cache for page id
+ private String pageId;
+ /**
+ * Constructor
+ *
+ * @param style -
+ * layout style
+ */
+ public FieldEditorOverlayPage(int style) {
+ super(style);
+ }
+ /**
+ * Constructor
+ *
+ * @param style -
+ * layout style
+ */
+ public FieldEditorOverlayPage(int style, boolean isFileSettings) {
+ super(style);
+ fUseFileSettings = isFileSettings;
+ }
+ /**
+ * Constructor
+ *
+ * @param title -
+ * title string
+ * @param style -
+ * layout style
+ */
+ public FieldEditorOverlayPage(String title, int style) {
+ super(title, style);
+ }
+ public FieldEditorOverlayPage(String title, int style, boolean isFileSettings) {
+ super(title, style);
+ fUseFileSettings = isFileSettings;
+ }
+ /**
+ * Constructor
+ *
+ * @param title -
+ * title string
+ * @param image -
+ * title image
+ * @param style -
+ * layout style
+ */
+ public FieldEditorOverlayPage(String title, ImageDescriptor image, int style) {
+ super(title, image, style);
+ this.image = image;
+ }
+ /**
+ * Returns the id of the current preference page as defined in plugin.xml
+ * Subclasses must implement.
+ *
+ * @return - the qualifier
+ */
+ protected abstract String getPageId();
+ /**
+ * Receives the object that owns the properties shown in this property page.
+ *
+ * @see org.eclipse.ui.IWorkbenchPropertyPage#setElement(org.eclipse.core.runtime.IAdaptable)
+ */
+ public void setElement(IAdaptable element) {
+ this.element = element;
+ }
+ /**
+ * Delivers the object that owns the properties shown in this property page.
+ *
+ * @see org.eclipse.ui.IWorkbenchPropertyPage#getElement()
+ */
+ public IAdaptable getElement() {
+ return element;
+ }
+ /**
+ * Returns true if this instance represents a property page
+ *
+ * @return - true for property pages, false for preference pages
+ */
+ public boolean isPropertyPage() {
+ return getElement() != null;
+ }
+ /**
+ * We override the addField method. This allows us to store each field editor
+ * added by subclasses in a list for later processing.
+ *
+ * @see org.eclipse.jface.preference.FieldEditorPreferencePage#addField(org.eclipse.jface.preference.FieldEditor)
+ */
+ protected void addField(FieldEditor editor) {
+ editors.add(editor);
+ super.addField(editor);
+ }
+ /**
+ * We override the createControl method. In case of property pages we create
+ * a new PropertyStore as local preference store. After all control have been
+ * create, we enable/disable these controls.
+ *
+ * @see org.eclipse.jface.preference.PreferencePage#createControl()
+ */
+ public void createControl(Composite parent) {
+ // Special treatment for property pages
+ if (isPropertyPage()) {
+ // Cache the page id
+ pageId = getPageId();
+ // Create an overlay preference store and fill it with properties
+ overlayStore = new PropertyStore((IResource) getElement(), super
+ .getPreferenceStore(), pageId);
+ // Set overlay store as current preference store
+ }
+ super.createControl(parent);
+ // Update state of all subclass controls
+ if (isPropertyPage())
+ updateFieldEditors();
+ }
+ /**
+ * We override the createContents method. In case of property pages we insert
+ * two radio buttons at the top of the page.
+ *
+ * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createContents(Composite parent) {
+ if (isPropertyPage())
+ createSelectionGroup(parent);
+ return super.createContents(parent);
+ }
+ /**
+ * Creates and initializes a selection group with two choice buttons and one
+ * push button.
+ *
+ * @param parent -
+ * the parent composite
+ */
+ private void createSelectionGroup(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ comp.setLayout(layout);
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ Composite radioGroup = new Composite(comp, SWT.NONE);
+ radioGroup.setLayout(new GridLayout());
+ radioGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ useWorkspaceSettingsButton = createRadioButton(radioGroup, Messages
+ .getString("OverlayPage.Use_Workspace_Settings")); //$NON-NLS-1$
+ if (fUseFileSettings) {
+ useProjectSettingsButton = createRadioButton(radioGroup, Messages
+ .getString("OverlayPage.Use_File_Settings")); //$NON-NLS-1$
+ } else {
+ useProjectSettingsButton = createRadioButton(radioGroup, Messages
+ .getString("OverlayPage.Use_Project_Settings")); //$NON-NLS-1$
+ }
+ configureButton = new Button(comp, SWT.PUSH);
+ configureButton.setText(Messages
+ .getString("OverlayPage.Configure_Workspace_Settings")); //$NON-NLS-1$
+ configureButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ configureWorkspaceSettings();
+ }
+ });
+ // Set workspace/project radio buttons
+ try {
+ String use = ((IResource) getElement())
+ .getPersistentProperty(new QualifiedName(pageId, USEPROJECTSETTINGS));
+ if (TRUE.equals(use)) {
+ useProjectSettingsButton.setSelection(true);
+ configureButton.setEnabled(false);
+ } else
+ useWorkspaceSettingsButton.setSelection(true);
+ } catch (CoreException e) {
+ useWorkspaceSettingsButton.setSelection(true);
+ }
+ }
+ /**
+ * Convenience method creating a radio button
+ *
+ * @param parent -
+ * the parent composite
+ * @param label -
+ * the button label
+ * @return - the new button
+ */
+ private Button createRadioButton(Composite parent, String label) {
+ final Button button = new Button(parent, SWT.RADIO);
+ button.setText(label);
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ configureButton.setEnabled(button == useWorkspaceSettingsButton);
+ updateFieldEditors();
+ }
+ });
+ return button;
+ }
+ /**
+ * Returns in case of property pages the overlay store, in case of preference
+ * pages the standard preference store
+ *
+ * @see org.eclipse.jface.preference.PreferencePage#getPreferenceStore()
+ */
+ public IPreferenceStore getPreferenceStore() {
+ if (isPropertyPage())
+ return overlayStore;
+ return super.getPreferenceStore();
+ }
+ /*
+ * Enables or disables the field editors and buttons of this page
+ */
+ private void updateFieldEditors() {
+ // We iterate through all field editors
+ boolean enabled = useProjectSettingsButton.getSelection();
+ updateFieldEditors(enabled);
+ }
+ /**
+ * Enables or disables the field editors and buttons of this page Subclasses
+ * may override.
+ *
+ * @param enabled -
+ * true if enabled
+ */
+ protected void updateFieldEditors(boolean enabled) {
+ Composite parent = getFieldEditorParent();
+ Iterator it = editors.iterator();
+ while (it.hasNext()) {
+ FieldEditor editor = (FieldEditor) it.next();
+ editor.setEnabled(enabled, parent);
+ }
+ }
+ /**
+ * We override the performOk method. In case of property pages we copy the
+ * values in the overlay store into the property values of the selected
+ * project. We also save the state of the radio buttons.
+ *
+ * @see org.eclipse.jface.preference.IPreferencePage#performOk()
+ */
+ public boolean performOk() {
+ boolean result = super.performOk();
+ if (result && isPropertyPage()) {
+ // Save state of radiobuttons in project properties
+ IResource resource = (IResource) getElement();
+ try {
+ String value = (useProjectSettingsButton.getSelection()) ? TRUE : FALSE;
+ resource.setPersistentProperty(new QualifiedName(pageId,
+ USEPROJECTSETTINGS), value);
+ } catch (CoreException e) {
+ }
+ }
+ return result;
+ }
+ /**
+ * We override the performDefaults method. In case of property pages we
+ * switch back to the workspace settings and disable the field editors.
+ *
+ * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+ */
+ protected void performDefaults() {
+ if (isPropertyPage()) {
+ useWorkspaceSettingsButton.setSelection(true);
+ useProjectSettingsButton.setSelection(false);
+ configureButton.setEnabled(true);
+ updateFieldEditors();
+ }
+ super.performDefaults();
+ }
+ /**
+ * Creates a new preferences page and opens it
+ *
+ * @see com.bdaum.SpellChecker.preferences.SpellCheckerPreferencePage#configureWorkspaceSettings()
+ */
+ protected void configureWorkspaceSettings() {
+ try {
+ // create a new instance of the current class
+ IPreferencePage page = (IPreferencePage) this.getClass().newInstance();
+ page.setTitle(getTitle());
+ page.setImageDescriptor(image);
+ // and show it
+ showPreferencePage(pageId, page);
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+ /**
+ * Show a single preference pages
+ *
+ * @param id -
+ * the preference page identification
+ * @param page -
+ * the preference page
+ */
+ protected void showPreferencePage(String id, IPreferencePage page) {
+ final IPreferenceNode targetNode = new PreferenceNode(id, page);
+ PreferenceManager manager = new PreferenceManager();
+ manager.addToRoot(targetNode);
+ final PreferenceDialog dialog = new PreferenceDialog(getControl()
+ .getShell(), manager);
+ BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() {
+ public void run() {
+ dialog.create();
+ dialog.setMessage(targetNode.getLabelText());
+ dialog.open();
+ }
+ });
+ }
+}
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.preferences;
+
+/**
+ * Internal images for wiki ui.
+ */
+public interface ITeamUIImages {
+
+ /**
+ * Icon for authentication dialogs.
+ */
+ public final String IMG_KEY_LOCK = "wizban/keylock.gif"; //$NON-NLS-1$
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.wiki.preferences;
+
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+
+/**
+ * Provides an infinite progress monitor by subdividing by half repeatedly.
+ *
+ * The ticks parameter represents the number of ticks shown in the progress dialog
+ * (or propogated up to a parent IProgressMonitor). The totalWork parameter provided
+ * in actually a hint used to determine how work is translated into ticks.
+ * The number of totalWork that can actually be worked is n*totalWork/2 where
+ * 2^n = totalWork. What this means is that if you provide a totalWork of 32 (2^5) than
+ * the maximum number of ticks is 5*32/2 = 80.
+ *
+ */
+public class InfiniteSubProgressMonitor extends SubProgressMonitor {
+
+ int totalWork;
+ int halfWay;
+ int currentIncrement;
+ int nextProgress;
+ int worked;
+
+ /**
+ * Constructor for InfiniteSubProgressMonitor.
+ * @param monitor
+ * @param ticks
+ */
+ public InfiniteSubProgressMonitor(IProgressMonitor monitor, int ticks) {
+ this(monitor, ticks, 0);
+ }
+
+ /**
+ * Constructor for InfiniteSubProgressMonitor.
+ * @param monitor
+ * @param ticks
+ * @param style
+ */
+ public InfiniteSubProgressMonitor(IProgressMonitor monitor, int ticks, int style) {
+ super(monitor, ticks, style);
+ }
+
+ public void beginTask(String name, int totalWork) {
+ super.beginTask(name, totalWork);
+ this.totalWork = totalWork;
+ this.halfWay = totalWork / 2;
+ this.currentIncrement = 1;
+ this.nextProgress = currentIncrement;
+ this.worked = 0;
+ }
+
+ public void worked(int work) {
+ if (worked >= totalWork) return;
+ if (--nextProgress <= 0) {
+ super.worked(1);
+ worked++;
+ if (worked >= halfWay) {
+ // we have passed the current halfway point, so double the
+ // increment and reset the halfway point.
+ currentIncrement *= 2;
+ halfWay += (totalWork - halfWay) / 2;
+ }
+ // reset the progress counter to another full increment
+ nextProgress = currentIncrement;
+ }
+ }
+
+ /**
+ * Don't allow clearing of the subtask. This will stop the flickering
+ * of the subtask in the progress dialogs.
+ *
+ * @see IProgressMonitor#subTask(String)
+ */
+ public void subTask(String name) {
+ if(name != null && ! name.equals("")) { //$NON-NLS-1$
+ super.subTask(name);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2003 Berthold Daum.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * Berthold Daum
+ *******************************************************************************/
+
+package net.sourceforge.phpeclipse.wiki.preferences;
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+
+public class Messages {
+
+ private final static String RESOURCE_BUNDLE= "net.sourceforge.phpeclipse.wiki.preferences.Messages";//$NON-NLS-1$
+
+ private static ResourceBundle fgResourceBundle = null;
+
+ private static boolean notRead = true;
+
+ public Messages() {
+ }
+ public static ResourceBundle getResourceBundle() {
+ if (notRead) {
+ notRead = false;
+ try {
+ fgResourceBundle = ResourceBundle.getBundle(RESOURCE_BUNDLE);
+ }
+ catch (Exception e) {
+ }
+ }
+
+ return fgResourceBundle;
+ }
+ public static String getString(String key) {
+ try {
+ return getResourceBundle().getString(key);
+ } catch (Exception e) {
+ return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$
+ }
+ }
+
+ /**
+ * Lookup the message with the given ID in this catalog and bind its
+ * substitution locations with the given string.
+ */
+ public static String bind(String id, String binding) {
+ return bind(id, new String[] { binding });
+ }
+
+ /**
+ * Lookup the message with the given ID in this catalog and bind its
+ * substitution locations with the given strings.
+ */
+ public static String bind(String id, String binding1, String binding2) {
+ return bind(id, new String[] { binding1, binding2 });
+ }
+
+ /**
+ * Gets a string from the resource bundle. We don't want to crash because of a missing String.
+ * Returns the key if not found.
+ */
+ public static String bind(String key) {
+ try {
+ return getString(key);
+ } catch (MissingResourceException e) {
+ return key;
+ } catch (NullPointerException e) {
+ return "!" + key + "!"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+
+ /**
+ * Gets a string from the resource bundle and binds it with the given arguments. If the key is
+ * not found, return the key.
+ */
+ public static String bind(String key, Object[] args) {
+ try {
+ return MessageFormat.format(bind(key), args);
+ } catch (MissingResourceException e) {
+ return key;
+ } catch (NullPointerException e) {
+ return "!" + key + "!"; //$NON-NLS-1$ //$NON-NLS-2$
+ }
+ }
+}
+
--- /dev/null
+WikiProjectPreferences.StaticWikiFolder=Projects Wikipedia to HTML output path:
+WikiProjectPreferences.WikiTextsFolder=Projects associated Wikipedia texts path:
+
+OverlayPage.Use_Workspace_Settings=Use &workspace settings
+OverlayPage.Use_Project_Settings=Use pr&oject settings
+OverlayPage.Use_File_Settings=Use &file settings
+OverlayPage.Configure_Workspace_Settings=&Configure Workspace Settings ...
+PropertyStore.Cannot_write_resource_property=Cannot write resource property
+
+UserValidationDialog.5=Configuration:
+UserValidationDialog.6=&Save Password
+UserValidationDialog.7=Saved passwords are stored on your computer in a file that's difficult, but not impossible, for an intruder to read.
+
+UserValidationDialog.required=Password Required
+UserValidationDialog.labelUser={0}
+UserValidationDialog.labelPassword={1}
+UserValidationDialog.password=&Password:
+UserValidationDialog.user=&User name:
+
+AlternateUserValidationDialog.Enter_Password_2=Enter Password
+AlternateUserValidationDialog.OK_6=OK
+AlternateUserValidationDialog.Cancel_7=Cancel
+AlternateUserValidationDialog.message=Enter the password for {0}:
\ No newline at end of file
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2003 Berthold Daum.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * Berthold Daum
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.wiki.preferences;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.jface.preference.IPreferenceNode;
+import org.eclipse.jface.preference.IPreferencePage;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.preference.PreferenceManager;
+import org.eclipse.jface.preference.PreferenceNode;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.BusyIndicator;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.ui.part.PageBook;
+
+/**
+ * @author Berthold Daum
+ */
+public abstract class OverlayPage extends PropertyPage {
+
+ /*** Name of resource property for the selection of workbench or project settings ***/
+ public static final String USEPROJECTSETTINGS = "useProjectSettings"; //$NON-NLS-1$
+
+ private static final String FALSE = "false"; //$NON-NLS-1$
+ private static final String TRUE = "true"; //$NON-NLS-1$
+
+ // Additional buttons for property pages
+ private Button useWorkspaceSettingsButton,
+ useProjectSettingsButton,
+ configureButton;
+
+ // Overlay preference store for property pages
+ private PropertyStore overlayStore;
+
+ // The image descriptor of this pages title image
+ private ImageDescriptor image;
+
+ // Cache for page id
+ private String pageId;
+
+ // Container for subclass controls
+ private Composite contents;
+
+ /**
+ * Constructor
+ */
+ public OverlayPage() {
+ super();
+ }
+
+ /**
+ * Constructor
+ * @param title - title string
+ */
+ public OverlayPage(String title) {
+ super();
+ setTitle(title);
+ }
+
+ /**
+ * Constructor
+ * @param title - title string
+ * @param image - title image
+ */
+ public OverlayPage(String title, ImageDescriptor image) {
+ super();
+ setTitle(title);
+ setImageDescriptor(image);
+ this.image = image;
+ }
+
+ /**
+ * Returns the id of the current preference page as defined in plugin.xml
+ * Subclasses must implement.
+ *
+ * @return - the qualifier
+ */
+ protected abstract String getPageId();
+
+ /**
+ * Returns true if this instance represents a property page
+ * @return - true for property pages, false for preference pages
+ */
+ public boolean isPropertyPage() {
+ return getElement() != null;
+ }
+
+ /**
+ * We need to implement createContents method. In case of property pages we insert two radio buttons
+ * and a push button at the top of the page. Below this group we create a new composite for the contents
+ * created by subclasses.
+ *
+ * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createContents(Composite parent) {
+ if (isPropertyPage())
+ createSelectionGroup(parent);
+ contents = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ contents.setLayout(layout);
+ contents.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ return contents;
+ }
+
+ /**
+ * Creates and initializes a selection group with two choice buttons and one push button.
+ * @param parent - the parent composite
+ */
+ private void createSelectionGroup(Composite parent) {
+ Composite comp = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout(2, false);
+ layout.marginHeight = 0;
+ layout.marginWidth = 0;
+ comp.setLayout(layout);
+ comp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ Composite radioGroup = new Composite(comp, SWT.NONE);
+ radioGroup.setLayout(new GridLayout());
+ radioGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+ useWorkspaceSettingsButton = createRadioButton(radioGroup, Messages.getString("OverlayPage.Use_Workspace_Settings")); //$NON-NLS-1$
+ useProjectSettingsButton = createRadioButton(radioGroup, Messages.getString("OverlayPage.Use_Project_Settings")); //$NON-NLS-1$
+ configureButton = new Button(comp, SWT.PUSH);
+ configureButton.setText(Messages.getString("OverlayPage.Configure_Workspace_Settings")); //$NON-NLS-1$
+ configureButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ configureWorkspaceSettings();
+ }
+ });
+ // Set workspace/project radio buttons
+ try {
+ String use =
+ ((IResource) getElement()).getPersistentProperty(
+ new QualifiedName(pageId, USEPROJECTSETTINGS));
+ if (TRUE.equals(use)) {
+ useProjectSettingsButton.setSelection(true);
+ configureButton.setEnabled(false);
+ } else
+ useWorkspaceSettingsButton.setSelection(true);
+ } catch (CoreException e) {
+ useWorkspaceSettingsButton.setSelection(true);
+ }
+ }
+
+ /**
+ * Convenience method creating a radio button
+ * @param parent - the parent composite
+ * @param label - the button label
+ * @return - the new button
+ */
+ private Button createRadioButton(Composite parent, String label) {
+ final Button button = new Button(parent, SWT.RADIO);
+ button.setText(label);
+ button.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ configureButton.setEnabled(
+ button == useWorkspaceSettingsButton);
+ setControlsEnabled();
+ }
+ });
+ return button;
+ }
+
+ /**
+ * In case of property pages we create a new PropertyStore as local overlay store.
+ * After all controls have been create, we enable/disable these controls
+ *
+ * @see org.eclipse.jface.preference.PreferencePage#createControl()
+ */
+ public void createControl(Composite parent) {
+ // Special treatment for property pages
+ if (isPropertyPage()) {
+ // Cache the page id
+ pageId = getPageId();
+ // Create an overlay preference store and fill it with properties
+ overlayStore =
+ new PropertyStore(
+ (IResource) getElement(),
+ super.getPreferenceStore(),
+ pageId);
+ // Set overlay store as current preference store
+ }
+ super.createControl(parent);
+ // Update enablement of all subclass controls
+ if (isPropertyPage())
+ setControlsEnabled();
+ }
+
+ /*
+ * Returns in case of property pages the overlay store - otherwise the standard preference store
+ * @see org.eclipse.jface.preference.PreferencePage#getPreferenceStore()
+ */
+ public IPreferenceStore getPreferenceStore() {
+ if (isPropertyPage())
+ return overlayStore;
+ return super.getPreferenceStore();
+ }
+
+ /**
+ * Enables or disables the controls of this page
+ */
+ private void setControlsEnabled() {
+ boolean enabled = useProjectSettingsButton.getSelection();
+ setControlsEnabled(enabled);
+ }
+
+ /**
+ * Enables or disables the controls of this page
+ * Subclasses may override.
+ *
+ * @param enabled - true if controls shall be enabled
+ */
+ protected void setControlsEnabled(boolean enabled) {
+ setControlsEnabled(contents, enabled);
+ }
+
+ /**
+ * Enables or disables a tree of controls starting at the specified root.
+ * We spare tabbed notebooks and pagebooks to allow for fUser navigation.
+ *
+ * @param root - the root composite
+ * @param enabled - true if controls shall be enabled
+ */
+ private void setControlsEnabled(Composite root, boolean enabled) {
+ Control[] children = root.getChildren();
+ for (int i = 0; i < children.length; i++) {
+ Control child = children[i];
+ if (!(child instanceof CTabFolder) && !(child instanceof TabFolder) && !(child instanceof PageBook))
+ child.setEnabled(enabled);
+ if (child instanceof Composite)
+ setControlsEnabled((Composite) child, enabled);
+ }
+ }
+
+ /**
+ * We override the performOk method. In case of property pages
+ * we save the state of the radio buttons.
+ *
+ * @see org.eclipse.jface.preference.IPreferencePage#performOk()
+ */
+ public boolean performOk() {
+ boolean result = super.performOk();
+ if (result && isPropertyPage()) {
+ // Save state of radiobuttons in project properties
+ IResource resource = (IResource) getElement();
+ try {
+ String value =
+ (useProjectSettingsButton.getSelection()) ? TRUE : FALSE;
+ resource.setPersistentProperty(
+ new QualifiedName(pageId, USEPROJECTSETTINGS),
+ value);
+ } catch (CoreException e) {
+ }
+ }
+ return result;
+ }
+
+ /**
+ * We override the performDefaults method. In case of property pages we
+ * switch back to the workspace settings and disable the page controls.
+ *
+ * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+ */
+ protected void performDefaults() {
+ if (isPropertyPage()) {
+ useWorkspaceSettingsButton.setSelection(true);
+ useProjectSettingsButton.setSelection(false);
+ configureButton.setEnabled(true);
+ setControlsEnabled();
+ }
+ super.performDefaults();
+ }
+
+ /**
+ * Creates a new preferences page and opens it
+ * @see com.bdaum.SpellChecker.preferences.SpellCheckerPreferencePage#configureWorkspaceSettings()
+ */
+ protected void configureWorkspaceSettings() {
+ try {
+ // create a new instance of the current class
+ IPreferencePage page =
+ (IPreferencePage) this.getClass().newInstance();
+ page.setTitle(getTitle());
+ page.setImageDescriptor(image);
+ // and show it
+ showPreferencePage(pageId, page);
+ } catch (InstantiationException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Show a single preference pages
+ * @param id - the preference page identification
+ * @param page - the preference page
+ */
+ protected void showPreferencePage(String id, IPreferencePage page) {
+ final IPreferenceNode targetNode = new PreferenceNode(id, page);
+ PreferenceManager manager = new PreferenceManager();
+ manager.addToRoot(targetNode);
+ final PreferenceDialog dialog =
+ new PreferenceDialog(getControl().getShell(), manager);
+ BusyIndicator.showWhile(getControl().getDisplay(), new Runnable() {
+ public void run() {
+ dialog.create();
+ dialog.setMessage(targetNode.getLabelText());
+ dialog.open();
+ }
+ });
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2003 Berthold Daum.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * Berthold Daum
+ *******************************************************************************/
+
+package net.sourceforge.phpeclipse.wiki.preferences;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferenceStore;
+
+/**
+ * @author Berthold Daum
+ *
+ */
+public class PropertyStore extends PreferenceStore {
+
+ private IResource resource;
+ private IPreferenceStore workbenchStore;
+ private String pageId;
+ private boolean inserting = false;
+
+ public PropertyStore(
+ IResource resource,
+ IPreferenceStore workbenchStore,
+ String pageId) {
+ this.resource = resource;
+ this.workbenchStore = workbenchStore;
+ this.pageId = pageId;
+ }
+
+ /*** Write modified values back to properties ***/
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPersistentPreferenceStore#save()
+ */
+ public void save() throws IOException {
+ writeProperties();
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.PreferenceStore#save(java.io.OutputStream, java.lang.String)
+ */
+ public void save(OutputStream out, String header) throws IOException {
+ writeProperties();
+ }
+
+ /**
+ * Writes modified preferences into resource properties.
+ */
+ private void writeProperties() throws IOException {
+ String[] preferences = super.preferenceNames();
+ for (int i = 0; i < preferences.length; i++) {
+ String name = preferences[i];
+ try {
+ setProperty(name, getString(name));
+ } catch (CoreException e) {
+ throw new IOException(Messages.getString("PropertyStore.Cannot_write_resource_property") + name); //$NON-NLS-1$
+ }
+ }
+ }
+
+ /**
+ * Convenience method to set a property
+ * @param name - the preference name
+ * @param value - the property value or null to delete the property
+ * @throws CoreException
+ */
+ private void setProperty(String name, String value) throws CoreException {
+ resource.setPersistentProperty(new QualifiedName(pageId, name), value);
+ }
+
+ /*** Get default values (Delegate to workbench store) ***/
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultBoolean(java.lang.String)
+ */
+ public boolean getDefaultBoolean(String name) {
+ return workbenchStore.getDefaultBoolean(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultDouble(java.lang.String)
+ */
+ public double getDefaultDouble(String name) {
+ return workbenchStore.getDefaultDouble(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultFloat(java.lang.String)
+ */
+ public float getDefaultFloat(String name) {
+ return workbenchStore.getDefaultFloat(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultInt(java.lang.String)
+ */
+ public int getDefaultInt(String name) {
+ return workbenchStore.getDefaultInt(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultLong(java.lang.String)
+ */
+ public long getDefaultLong(String name) {
+ return workbenchStore.getDefaultLong(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getDefaultString(java.lang.String)
+ */
+ public String getDefaultString(String name) {
+ return workbenchStore.getDefaultString(name);
+ }
+
+ /*** Get property values ***/
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getBoolean(java.lang.String)
+ */
+ public boolean getBoolean(String name) {
+ insertValue(name);
+ return super.getBoolean(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getDouble(java.lang.String)
+ */
+ public double getDouble(String name) {
+ insertValue(name);
+ return super.getDouble(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getFloat(java.lang.String)
+ */
+ public float getFloat(String name) {
+ insertValue(name);
+ return super.getFloat(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getInt(java.lang.String)
+ */
+ public int getInt(String name) {
+ insertValue(name);
+ return super.getInt(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getLong(java.lang.String)
+ */
+ public long getLong(String name) {
+ insertValue(name);
+ return super.getLong(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#getString(java.lang.String)
+ */
+ public String getString(String name) {
+ insertValue(name);
+ return super.getString(name);
+ }
+
+ /**
+ * @param name
+ */
+ private synchronized void insertValue(String name) {
+ if (inserting)
+ return;
+ if (super.contains(name))
+ return;
+ inserting = true;
+ String prop = null;
+ try {
+ prop = getProperty(name);
+ } catch (CoreException e) {
+ }
+ if (prop == null)
+ prop = workbenchStore.getString(name);
+ if (prop != null)
+ setValue(name, prop);
+ inserting = false;
+ }
+
+ /**
+ * Convenience method to fetch a property
+ * @param name - the preference name
+ * @return - the property value
+ * @throws CoreException
+ */
+ private String getProperty(String name) throws CoreException {
+ return resource.getPersistentProperty(new QualifiedName(pageId, name));
+ }
+
+ /*** Misc ***/
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#contains(java.lang.String)
+ */
+ public boolean contains(String name) {
+ return workbenchStore.contains(name);
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#setToDefault(java.lang.String)
+ */
+ public void setToDefault(String name) {
+ setValue(name, getDefaultString(name));
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.preference.IPreferenceStore#isDefault(java.lang.String)
+ */
+ public boolean isDefault(String name) {
+ String defaultValue = getDefaultString(name);
+ if (defaultValue == null) return false;
+ return defaultValue.equals(getString(name));
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.wiki.preferences;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.ISharedImages;
+
+/**
+ * TeamImages provides convenience methods for accessing shared images
+ * provided by the <i>org.eclipse.team.ui</i> plug-in.
+ * <p>
+ * This class provides <code>ImageDescriptor</code>s for each named image in
+ * {@link ISharedImages}. All <code>Image</code> objects created from the
+ * provided descriptors are managed the caller and must be disposed appropriately.
+ * </p>
+ * @since 2.0
+ */
+public class TeamImages {
+ /**
+ * Returns the image descriptor for the given image ID.
+ * Returns <code>null</code> if there is no such image.
+ *
+ * @param id the identifier for the image to retrieve
+ * @return the image descriptor associated with the given ID
+ */
+ public static ImageDescriptor getImageDescriptor(String id) {
+ return WikiEditorPlugin.getImageDescriptor(id);
+ }
+ /**
+ * Convenience method to get an image descriptor for an extension.
+ *
+ * @param extension the extension declaring the image
+ * @param subdirectoryAndFilename the path to the image
+ * @return the image descriptor for the extension
+ */
+ public static ImageDescriptor getImageDescriptorFromExtension(IExtension extension, String subdirectoryAndFilename) {
+ return WikiEditorPlugin.getImageDescriptorFromExtension(extension, subdirectoryAndFilename);
+ }
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package net.sourceforge.phpeclipse.wiki.preferences;
+
+
+
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * A dialog for prompting for a username and fPassword
+ */
+public class UserValidationDialog extends Dialog {
+ // widgets
+ protected Text usernameField;
+ protected Text passwordField;
+ protected Button allowCachingButton;
+
+ protected String domain;
+ protected String defaultUsername;
+ protected String password = null;
+ protected boolean allowCaching = false;
+ protected Image keyLockImage;
+
+ // whether or not the username can be changed
+ protected boolean isUsernameMutable = true;
+ protected boolean showAllowCachingButton = true;
+ protected String username = null;
+ protected String message = null;
+
+ /**
+ * Creates a new UserValidationDialog.
+ *
+ * @param parentShell the parent shell
+ * @param location the location
+ * @param defaultName the default fUser name
+ * @param message a mesage to display to the fUser
+ */
+ public UserValidationDialog(Shell parentShell, String location, String defaultName, String message) {
+ super(parentShell);
+ this.defaultUsername = defaultName;
+ this.domain = location;
+ this.message = message;
+ }
+ /**
+ * @see Window#configureShell
+ */
+ protected void configureShell(Shell newShell) {
+ super.configureShell(newShell);
+ newShell.setText(Messages.getString("UserValidationDialog.required")); //$NON-NLS-1$
+ // set F1 help
+// WorkbenchHelp.setHelp(newShell, IHelpContextIds.USER_VALIDATION_DIALOG);
+ }
+ /**
+ * @see Window#create
+ */
+ public void create() {
+ super.create();
+ // add some default values
+ usernameField.setText(defaultUsername);
+
+ if (isUsernameMutable) {
+ // give focus to username field
+ usernameField.selectAll();
+ usernameField.setFocus();
+ } else {
+ usernameField.setEditable(false);
+ passwordField.setFocus();
+ }
+ }
+
+ /**
+ * @see Dialog#createDialogArea
+ */
+ protected Control createDialogArea(Composite parent) {
+ Composite top = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 2;
+
+ top.setLayout(layout);
+ top.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Composite imageComposite = new Composite(top, SWT.NONE);
+ layout = new GridLayout();
+ imageComposite.setLayout(layout);
+ imageComposite.setLayoutData(new GridData(GridData.FILL_VERTICAL));
+
+ Composite main = new Composite(top, SWT.NONE);
+ layout = new GridLayout();
+ layout.numColumns = 3;
+ main.setLayout(layout);
+ main.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+ Label imageLabel = new Label(imageComposite, SWT.NONE);
+ keyLockImage = TeamImages.getImageDescriptor(ITeamUIImages.IMG_KEY_LOCK).createImage();
+ imageLabel.setImage(keyLockImage);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+ imageLabel.setLayoutData(data);
+
+ if (message != null) {
+ Label messageLabel = new Label(main, SWT.WRAP);
+ messageLabel.setText(message);
+ data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+ data.horizontalSpan = 3;
+ data.widthHint = 300;
+ messageLabel.setLayoutData(data);
+ }
+ if (domain != null) {
+ Label d = new Label(main, SWT.WRAP);
+ d.setText(Messages.getString("UserValidationDialog.5")); //$NON-NLS-1$
+ data = new GridData();
+ d.setLayoutData(data);
+ Label label = new Label(main, SWT.WRAP);
+ if (isUsernameMutable) {
+ label.setText(Messages.bind("UserValidationDialog.labelUser", domain)); //$NON-NLS-1$
+ } else {
+ label.setText(Messages.bind("UserValidationDialog.labelPassword", new Object[]{defaultUsername, domain})); //$NON-NLS-1$
+ }
+ data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+ data.horizontalSpan = 2;
+ data.widthHint = 300;
+ label.setLayoutData(data);
+ }
+ createUsernameFields(main);
+ createPasswordFields(main);
+
+ if(domain != null && showAllowCachingButton) {
+ allowCachingButton = new Button(main, SWT.CHECK);
+ allowCachingButton.setText(Messages.getString("UserValidationDialog.6")); //$NON-NLS-1$
+ data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+ data.horizontalSpan = 3;
+ allowCachingButton.setLayoutData(data);
+ allowCachingButton.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ allowCaching = allowCachingButton.getSelection();
+ }
+ });
+ Composite warningComposite = new Composite(main, SWT.NONE);
+ layout = new GridLayout();
+ layout.numColumns = 2;
+ layout.marginHeight = 0;
+ layout.marginHeight = 0;
+ warningComposite.setLayout(layout);
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 3;
+ warningComposite.setLayoutData(data);
+ Label warningLabel = new Label(warningComposite, SWT.NONE);
+ warningLabel.setImage(getImage(DLG_IMG_MESSAGE_WARNING));
+ warningLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_BEGINNING));
+ Label warningText = new Label(warningComposite, SWT.WRAP);
+ warningText.setText(Messages.getString("UserValidationDialog.7")); //$NON-NLS-1$
+ data = new GridData(GridData.FILL_HORIZONTAL);
+ data.widthHint = 300;
+ warningText.setLayoutData(data);
+ }
+
+ Dialog.applyDialogFont(parent);
+
+ return main;
+ }
+ /**
+ * Create a spacer.
+ */
+ protected void createSpacer(Composite top, int columnSpan, int vertSpan) {
+ Label l = new Label(top, SWT.NONE);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL);
+ data.horizontalSpan = columnSpan;
+ data.verticalSpan = vertSpan;
+ l.setLayoutData(data);
+ }
+
+ /**
+ * Creates the three widgets that represent the fPassword entry area.
+ *
+ * @param parent the parent of the widgets
+ */
+ protected void createPasswordFields(Composite parent) {
+ new Label(parent, SWT.NONE).setText(Messages.getString("UserValidationDialog.fPassword")); //$NON-NLS-1$
+
+ passwordField = new Text(parent, SWT.BORDER | SWT.PASSWORD);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 2;
+ data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH);
+ passwordField.setLayoutData(data);
+ }
+ /**
+ * Creates the three widgets that represent the fUser name entry area.
+ *
+ * @param parent the parent of the widgets
+ */
+ protected void createUsernameFields(Composite parent) {
+ new Label(parent, SWT.NONE).setText(Messages.getString("UserValidationDialog.fUser")); //$NON-NLS-1$
+
+ usernameField = new Text(parent, SWT.BORDER);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 2;
+ data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.ENTRY_FIELD_WIDTH);
+ usernameField.setLayoutData(data);
+ }
+
+ /**
+ * Returns the fPassword entered by the fUser, or null
+ * if the fUser canceled.
+ *
+ * @return the entered fPassword
+ */
+ public String getPassword() {
+ return password;
+ }
+
+ /**
+ * Returns the username entered by the fUser, or null
+ * if the fUser canceled.
+ *
+ * @return the entered username
+ */
+ public String getUsername() {
+ return username;
+ }
+
+ /**
+ * Returns <code>true</code> if the save fPassword checkbox was selected.
+ * @return <code>true</code> if the save fPassword checkbox was selected and <code>false</code>
+ * otherwise.
+ */
+ public boolean getAllowCaching() {
+ return allowCaching;
+ }
+
+ /**
+ * Notifies that the ok button of this dialog has been pressed.
+ * <p>
+ * The default implementation of this framework method sets
+ * this dialog's return code to <code>Window.OK</code>
+ * and closes the dialog. Subclasses may override.
+ * </p>
+ */
+ protected void okPressed() {
+ password = passwordField.getText();
+ username = usernameField.getText();
+
+ super.okPressed();
+ }
+ /**
+ * Sets whether or not the username field should be mutable.
+ * This method must be called before create(), otherwise it
+ * will be ignored.
+ *
+ * @param value whether the username is mutable
+ */
+ public void setUsernameMutable(boolean value) {
+ isUsernameMutable = value;
+ }
+
+ public void setShowAllowCachingButton(boolean value) {
+ showAllowCachingButton = value;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#close()
+ */
+ public boolean close() {
+ if(keyLockImage != null) {
+ keyLockImage.dispose();
+ }
+ return super.close();
+ }
+}
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.preferences;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.plog4u.wiki.filter.FilterUtil;
+
+public class Util {
+ public static Shell findShell() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+ if (window != null) {
+ return window.getShell();
+ }
+ Display display = Display.getCurrent();
+ if (display == null) {
+ display = Display.getDefault();
+ return display.getActiveShell();
+ }
+ // worst case, just create our own.
+ return new Shell(WikiEditorPlugin.getStandardDisplay());
+ }
+
+ public static String getProjectsWikiOutputPath(IResource resource, String key) {
+ return getOverlayedPrefProjectValue(resource, WikiProjectPreferences.PREF_ID, key);
+ // int index = temp.indexOf(File.pathSeparatorChar);
+ // if (index >= 0) {
+ // temp = temp.substring(0, index);
+ // }
+ // return temp;
+ }
+
+ public static String getPreferenceValue(IResource resource, String key) {
+ return getOverlayedPrefProjectValue(resource, WikiProjectPreferences.PREF_ID, key);
+ }
+
+ public static String getHTMLFileName(IFile file, String binBasePath, String srcBasePath) {
+ StringBuffer htmlBuffer = new StringBuffer();
+ String htmlName = null;
+ // String srcBasePath = Util.getWikiTextsPath(file);
+ // String fileName = file.getProjectRelativePath().toString();
+ String fileName = file.getLocation().toString();
+ if (fileName.startsWith(srcBasePath)) {
+ fileName = fileName.substring(srcBasePath.length());
+ if (fileName.charAt(0) != '/') {
+ fileName = "/" + fileName;
+ }
+ int index = fileName.lastIndexOf(".wp");
+ if (index >= 0) {
+ htmlName = binBasePath + fileName.substring(0, index) + ".html";
+ } else {
+ htmlName = binBasePath + fileName;
+ }
+ }
+ return htmlName;
+ }
+
+ public static String getOverlayedPrefProjectValue(IResource resource, String pageId, String key) {
+ IProject project = resource.getProject();
+ String value = null;
+ if (useProjectSettings(project, pageId)) {
+ value = getProperty(resource, pageId, key);
+ }
+ if (value != null)
+ return value;
+ return WikiEditorPlugin.getDefault().getPreferenceStore().getString(key);
+ }
+
+ public static String getOverlayedPrefResourceValue(IResource resource, String pageId, String key) {
+ String value = null;
+ if (useProjectSettings(resource, pageId)) {
+ value = getProperty(resource, pageId, key);
+ }
+ if (value != null)
+ return value;
+ return WikiEditorPlugin.getDefault().getPreferenceStore().getString(key);
+ }
+
+ private static String getProperty(IResource resource, String pageId, String key) {
+ try {
+ return resource.getPersistentProperty(new QualifiedName(pageId, key));
+ } catch (CoreException e) {
+ }
+ return null;
+ }
+
+ private static void setProperty(IResource resource, String pageId, String key, String value) {
+ try {
+ resource.setPersistentProperty(new QualifiedName(pageId, key), value);
+ } catch (CoreException e) {
+ }
+ }
+
+ private static boolean useProjectSettings(IResource resource, String pageId) {
+ String use = getProperty(resource, pageId, FieldEditorOverlayPage.USEPROJECTSETTINGS);
+ return "true".equals(use);
+ }
+
+ public static void setWikiTextsPath(IProject project) {
+ String value = project.getLocation().toString();
+ IPreferenceStore store = WikiEditorPlugin.getDefault().getPreferenceStore();
+ String globalBasePath = store.getString(WikiEditorPlugin.WIKI_TEXTS_BASE_PATH);
+ if (globalBasePath == null || globalBasePath.equals("")) {
+ store.setValue(WikiEditorPlugin.WIKI_TEXTS_BASE_PATH, value + "/wpsrc");
+ }
+ String htmlFolder = store.getString(WikiEditorPlugin.HTML_OUTPUT_PATH);
+ if (htmlFolder == null || htmlFolder.equals("")) {
+ // set a global default
+ store.setValue(WikiEditorPlugin.HTML_OUTPUT_PATH, value + "/wpbin");
+ }
+ setProperty(project, WikiProjectPreferences.PREF_ID, FieldEditorOverlayPage.USEPROJECTSETTINGS, "true");
+ setProperty(project, WikiProjectPreferences.PREF_ID, WikiEditorPlugin.WIKI_TEXTS_BASE_PATH, value + "/wpsrc");
+ setProperty(project, WikiProjectPreferences.PREF_ID, WikiEditorPlugin.HTML_OUTPUT_PATH, value + "/wpbin");
+
+ // IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ // IResource resource = root.findMember(project.getLocation());
+ NullProgressMonitor _monitor = new NullProgressMonitor();
+ // if (resource!=null && resource.exists() && (resource instanceof IContainer)) {
+ // IContainer container = (IContainer) resource;
+ final IFolder srcFolder = project.getFolder(new Path("wpsrc"));
+ if (!srcFolder.exists()) {
+ try {
+ srcFolder.create(true, false, _monitor);
+ } catch (CoreException e) {
+ }
+ }
+ final IFolder binFolder = project.getFolder(new Path("wpbin"));
+ if (!binFolder.exists()) {
+ try {
+ binFolder.create(true, false, _monitor);
+ } catch (CoreException e) {
+ }
+ }
+ // }
+
+ }
+
+ public static String getWikiTextsPath(IResource file) {
+ return Util.getPreferenceValue(file.getProject(), WikiEditorPlugin.WIKI_TEXTS_BASE_PATH);
+ }
+
+ public static String getProjectsWikiTextsPath(IProject project) {
+ return Util.getPreferenceValue(project, WikiEditorPlugin.WIKI_TEXTS_BASE_PATH);
+ }
+
+ public static String getWikiFileName(String wikiLink, IFile currentFile, String key) {
+ // String basePath = currentFile.getProject().getLocation().toString();
+ String basePath = getWikiTextsPath(currentFile);
+ return basePath + "/" + FilterUtil.normalizeWikiLink(wikiLink) + ".wp";
+ }
+
+ public static String getFileWikiName(IFile currentFile, String key) {
+ String filePath = currentFile.getLocation().toString();
+ // String basePath = currentFile.getProject().getLocation().toString();
+ String basePath = getWikiTextsPath(currentFile);
+ StringBuffer result = new StringBuffer();
+ int lastIndex = filePath.lastIndexOf(".wp");
+ if (lastIndex < 0) {
+ lastIndex = filePath.length();
+ }
+ char ch;
+ for (int i = basePath.length() + 1; i < lastIndex; i++) {
+ ch = filePath.charAt(i);
+ switch (ch) {
+ case '/':
+ result.append(':');
+ break;
+ default:
+ result.append(ch);
+ }
+ }
+ return result.toString();
+ }
+
+ public static String getWikiTitle(IFile currentFile) {
+ String fileName = currentFile.getName();
+ String fileExt = currentFile.getFileExtension().toLowerCase();
+ if (fileExt.equals("wp")) {
+ return fileName.substring(0, fileName.length() - 3);
+ }
+ return null;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.preferences;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.jface.preference.DirectoryFieldEditor;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PathEditor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+
+/**
+ *
+ * This page will be added to the project's property page dialog when the "Properties..." popup menu item is selected
+ */
+public class WikiProjectPreferences extends FieldEditorOverlayPage implements IWorkbenchPreferencePage {
+
+ public final static String PREF_ID = "net.sourceforge.phpeclipse.wiki.preferences.WikiProjectPreferences";
+
+ public WikiProjectPreferences() {
+ super(GRID);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sourceforge.phpeclipse.wiki.preferences.FieldEditorOverlayPage#getPageId()
+ */
+ protected String getPageId() {
+ return PREF_ID;
+ }
+
+ protected void createFieldEditors() {
+ Composite composite = getFieldEditorParent();
+
+ addField(new DirectoryFieldEditor(WikiEditorPlugin.HTML_OUTPUT_PATH, Messages.getString("WikiProjectPreferences.StaticWikiFolder"), composite));
+ addField(new DirectoryFieldEditor(WikiEditorPlugin.WIKI_TEXTS_BASE_PATH, Messages.getString("WikiProjectPreferences.WikiTextsFolder"), composite));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.preference.PreferencePage#doGetPreferenceStore()
+ */
+ protected IPreferenceStore doGetPreferenceStore() {
+ return WikiEditorPlugin.getDefault().getPreferenceStore();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.IWorkbenchPreferencePage#init(org.eclipse.ui.IWorkbench)
+ */
+ public void init(IWorkbench workbench) {
+ setDescription("Default entries static wiki pages.");
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.renderer;
+
+import java.io.IOException;
+import java.util.StringTokenizer;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditor;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.preferences.Util;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+
+public abstract class AbstractContentRenderer implements IContentRenderer {
+ protected IProject fProject;
+
+ public static final String CLASS_MONO_SPACE = "monospace";
+
+ public static final String CLASS_QUOTE = "quote";
+
+ public static final String TABLE_DELIMETER = "|";
+
+ public static final String HR = "hr";
+
+ public static final String NEW_WIKIDOC_HREF = "?";
+
+ public static final String WIKI_HREF = "http://--wiki/";
+
+ public static final String[][] REPLACE_TEXT = new String[][] { { "<", "<" }, { "\"", """ } };
+
+ private WikiEditor editor;
+
+ protected StringBuffer buffer;
+
+ private int currentLine;
+
+ private int currentListDepth;
+
+ private boolean inTable;
+
+ private void setEditor(WikiEditor editor) {
+ this.editor = editor;
+ }
+
+ protected StringBuffer getBuffer() {
+ return buffer;
+ }
+
+ protected WikiEditor getEditor() {
+ return editor;
+ }
+
+ // public void render(String content, StringBuffer buf) {
+ // try {
+ // buffer = buf;
+ // appendHeader();
+ //
+ // int index = 0;
+ // int startIndex = 0;
+ // String line;
+ // while (index < content.length()) {
+ // if (content.charAt(index++) == '\n') {
+ // line = content.substring(startIndex, index);
+ // startIndex = index;
+ // appendLine(line);
+ //
+ // }
+ // index++;
+ // }
+ // if (startIndex < content.length()) {
+ // line = content.substring(startIndex, content.length());
+ // renderLine(line);
+ // }
+ // appendFooter();
+ // // return buffer.toString();
+ // } catch (Exception e) {
+ // WikiEditorPlugin.getDefault().log(buffer.toString());
+ // WikiEditorPlugin.getDefault().log(e.getLocalizedMessage(), e);
+ // // return "<html><body><p>" + e.getLocalizedMessage() +
+ // // "</p></body></html>";
+ // }
+ // }
+
+ // protected void renderLine(String line) {
+ // if (isHeader(line)) {
+ // appendHeader(line);
+ // } else if (isList(line)) {
+ // appendListItem(line);
+ // } else if (tableLine(line)) {
+ // processTable(line);
+ // } else if (process(line)) {
+ // return;
+ // } else {
+ // buffer.append(line);
+ // }
+ // }
+
+ // public final String render(WikiEditor editor) {
+ // initialise(editor);
+ // try {
+ // buffer = new StringBuffer();
+ // appendHeader();
+ // buffer.append("<h1>").append(editor.getWikiNameBeingEdited()).append("</h1>");
+ // appendContents();
+ // appendFooter();
+ // return buffer.toString();
+ // } catch (Exception e) {
+ // WikiEditorPlugin.getDefault().log(buffer.toString());
+ // WikiEditorPlugin.getDefault().log(e.getLocalizedMessage(), e);
+ // return "<html><body><p>" + e.getLocalizedMessage() + "</p></body></html>";
+ // }
+ // }
+
+ private void initialise(WikiEditor editor) {
+ setEditor(editor);
+ currentListDepth = 0;
+ inTable = false;
+ initialise();
+ }
+
+ protected abstract void initialise();
+
+ protected void appendHeader() throws IOException {
+ buffer.append("<html><head>");
+ // String basePath = Util.getMiscProjectsPreferenceValue(fProject, WikiConstants.HTML_OUTPUT_PATH);
+ // buffer.append("<base href=\"" + basePath + "/" + fProject.getName() + "\"/>");
+
+ // if (WikiEditorPlugin.getDefault().getPluginPreferences().contains(WikiConstants.BROWSER_CSS_URL)) {
+ // buffer.append("<link href=\"")
+ // .append(WikiEditorPlugin.getDefault().getPluginPreferences().getString(WikiConstants.BROWSER_CSS_URL)).append(
+ // "\" fType=\"text/css\" rel=\"STYLESHEET\">");
+ // }
+ // appendStyle();
+
+ buffer.append("</head><body>\n");
+ }
+
+ private void appendContents() {
+ IDocument document = editor.getDocument();
+ currentLine = 0;
+ while (currentLine < document.getNumberOfLines()) {
+ String line = getLine(document, currentLine);
+ // appendLine(line);
+ currentLine++;
+ }
+ }
+
+ protected void appendNewLine() {
+ getBuffer().append(System.getProperty("line.separator"));
+ }
+
+ // protected String getNextLine() {
+ // if (hasLine(currentLine + 1)) {
+ // currentLine++;
+ // return getLine(editor.getDocument(), currentLine);
+ // }
+ // throw new RuntimeException("Should not be called if there is no next line.");
+ // }
+
+ // protected String peekNextLine() {
+ // if (hasLine(currentLine + 1)) {
+ // return getLine(editor.getDocument(), currentLine + 1);
+ // }
+ // return "";
+ // }
+
+ protected boolean hasNextLine() {
+ return hasLine(currentLine + 1);
+ }
+
+ private boolean hasLine(int lineNumber) {
+ return lineNumber < editor.getDocument().getNumberOfLines();
+ }
+
+ protected void appendFooter() {
+ buffer.append("\n</body></html>");
+ }
+
+ // protected void appendStyle() throws IOException {
+ // buffer.append("<style fType=\"text/css\"><!--");
+ // IPath path = new Path("style").append(RendererFactory.getContentRendererName() + ".css");
+ // buffer.append(WikiEditorPlugin.getDefault().loadTextContents(path));
+ // buffer.append("--></style>");
+ // }
+ //
+ // protected void appendLine(String line) {
+ // if (isHeader(line)) {
+ // appendHeader(line);
+ // } else if (isList(line)) {
+ // appendListItem(line);
+ // } else if (tableLine(line)) {
+ // processTable(line);
+ // } else if (process(line)) {
+ // return;
+ // } else {
+ // buffer.append("<p>");
+ // append(processTags(line));
+ // buffer.append("</p>");
+ // }
+ // }
+
+ // private final void appendListItem(String line) {
+ // int bullet = getListDepth(line);
+ // if (bullet > currentListDepth) {
+ // repeatAppend("<ul>", bullet - currentListDepth);
+ // currentListDepth = bullet;
+ // } else if (bullet < currentListDepth) {
+ // repeatAppend("</ul>", currentListDepth - bullet);
+ // currentListDepth = bullet;
+ // }
+ // getBuffer().append("<li>");
+ // String content = "";
+ // if (bullet < line.length() - 1) {
+ // content = getListtext(line);
+ // }
+ // append(processTags(content));
+ // getBuffer().append("</li>");
+ // if (!isList(peekNextLine())) {
+ // repeatAppend("</ul>", currentListDepth);
+ // currentListDepth = 0;
+ // }
+ // }
+
+ protected abstract String getListtext(String line);
+
+ protected void repeatAppend(String item, int n) {
+ for (int i = 0; i < n; i++) {
+ getBuffer().append(item);
+ }
+ }
+
+ protected abstract int getListDepth(String line);
+
+ protected abstract String processTags(String line);
+
+ private String getLine(IDocument document, int n) {
+ try {
+ String line = document.get(document.getLineOffset(n), document.getLineLength(n));
+ if (document.getLineDelimiter(n) != null) {
+ line = line.substring(0, line.length() - document.getLineDelimiter(n).length());
+ }
+ for (int i = 0; i < REPLACE_TEXT.length; i++) {
+ line = line.replaceAll(REPLACE_TEXT[i][0], REPLACE_TEXT[i][1]);
+ }
+ return line;
+ } catch (BadLocationException e) {
+ WikiEditorPlugin.getDefault().logAndReport("Error", e.getLocalizedMessage(), e);
+ return e.getLocalizedMessage();
+ }
+ }
+
+ // protected void append(String line) {
+ // TextRegion[] regions = TextRegionBuilder.getTextRegions(line, editor);
+ // for (int i = 0; i < regions.length; i++) {
+ // regions[i].accept(new TextRegionVisitor() {
+ // public Object visit(UndefinedTextRegion undefinedTextRegion) {
+ // buffer.append(undefinedTextRegion.getText());
+ // return null;
+ // }
+ //
+ // public Object visit(UrlTextRegion urlTextRegion) {
+ // appendLink(urlTextRegion.getText(), urlTextRegion.getText());
+ // return null;
+ // }
+ //
+ // public Object visit(WikiNameTextRegion wikiNameTextRegion) {
+ // if (editor.hasWikiSibling(wikiNameTextRegion)) {
+ // appendLink(AbstractContentRenderer.WIKI_HREF + wikiNameTextRegion.getText(), wikiNameTextRegion.getText());
+ // } else {
+ // buffer.append(wikiNameTextRegion.getText());
+ // appendLink(AbstractContentRenderer.WIKI_HREF + wikiNameTextRegion.getText(), AbstractContentRenderer.NEW_WIKIDOC_HREF);
+ // }
+ // return null;
+ // }
+ //
+ // public Object visit(WikiUrlTextRegion wikiUrlTextRegion) {
+ // String link;
+ // if (wikiUrlTextRegion.getLink().startsWith(WikiConstants.ECLIPSE_PREFIX)) {
+ // link = AbstractContentRenderer.WIKI_HREF + wikiUrlTextRegion.getLink();
+ // } else {
+ // link = wikiUrlTextRegion.getLink();
+ // }
+ // appendLink(link, wikiUrlTextRegion.getText());
+ // return null;
+ // }
+ //
+ // public Object visit(BasicTextRegion basicTextRegion) {
+ // buffer.append(basicTextRegion.getText());
+ // return null;
+ // }
+ //
+ // public Object visit(EclipseResourceTextRegion eclipseResourceTextRegion) {
+ // appendLink(AbstractContentRenderer.WIKI_HREF + eclipseResourceTextRegion.getText(), eclipseResourceTextRegion.getText());
+ // return null;
+ // }
+ //
+ // public Object visit(JavaTypeTextRegion region) {
+ // try {
+ // if (region.getType().getUnderlyingResource() != null) {
+ // String url = AbstractContentRenderer.WIKI_HREF + WikiConstants.ECLIPSE_PREFIX
+ // + region.getType().getUnderlyingResource().getFullPath().toString();
+ // appendLink(url, region.getText());
+ // } else {
+ // append(region.getText());
+ // }
+ // } catch (JavaModelException e) {
+ // WikiPlugin.getDefault().logAndReport("Error", e.getLocalizedMessage(), e);
+ // }
+ // return null;
+ // }
+ //
+ // });
+ // }
+ // }
+
+ protected void appendLink(String url, String text) {
+ buffer.append("<a href=\"").append(url).append("\">").append(text).append("</a>");
+ }
+
+ protected abstract boolean isHeader(String line);
+
+ protected abstract void appendHeader(String line);
+
+ protected abstract boolean isList(String line);
+
+ /**
+ * Gives implementors a chance to do processing on this line.
+ *
+ * @return if true, the line will not be processed further
+ */
+ protected abstract boolean process(String line);
+
+ /**
+ * Replace all occurrences of markeup which occurs in pairs with an opening and closing tag in the given line. e.g.
+ *
+ * <pre>
+ *
+ *
+ *
+ *
+ *
+ * replacePair("my ''bold'' word", "''", "<b>", ",</b>") returns "my <b>bold</b> word"
+ *
+ *
+ *
+ *
+ *
+ * </pre>
+ */
+ protected String replacePair(String line, String search, String openingTag, String closingTag) {
+ StringBuffer buffer = new StringBuffer();
+ String[] foo = line.split(search);
+ for (int i = 0; i < foo.length; i++) {
+ if (i % 2 == 1) {
+ buffer.append(openingTag).append(foo[i]).append(closingTag);
+ } else {
+ buffer.append(foo[i]);
+ }
+ }
+ return buffer.toString();
+ }
+
+ protected void appendHR() {
+ getBuffer().append("<hr>");
+ }
+
+ private boolean tableLine(String line) {
+ return line.startsWith(AbstractContentRenderer.TABLE_DELIMETER);
+ }
+
+ // private void processTable(String line) {
+ // if (!inTable) {
+ // inTable = true;
+ // getBuffer().append(getTableTag());
+ // }
+ // getBuffer().append("<tr>");
+ // StringTokenizer tokenizer = new StringTokenizer(line, AbstractContentRenderer.TABLE_DELIMETER);
+ // while (tokenizer.hasMoreTokens()) {
+ // String cell = tokenizer.nextToken();
+ // String element = "td";
+ // if (cell.trim().startsWith("*")) {
+ // element = "th";
+ // cell = cell.replaceAll("\\*", "");
+ // }
+ // getBuffer().append("<").append(element).append(">");
+ // append(processTags(cell));
+ // getBuffer().append("</").append(element).append(">");
+ // }
+ // getBuffer().append("</tr>");
+ // if (!tableLine(peekNextLine())) {
+ // getBuffer().append("</table>");
+ // inTable = false;
+ // }
+ // }
+
+ /**
+ * @return the tag for table (can be overridden to add style)
+ */
+ protected String getTableTag() {
+ return "<table>";
+ }
+
+ public void forEachHeader(IDocument document, StructureClosure closure) throws BadLocationException {
+ for (int i = 0; i < document.getNumberOfLines(); i++) {
+ String line = getLine(document, i);
+ if (isHeader(line)) {
+ String header = getHeaderText(line);
+ closure.acceptHeader(header, document.getLineOffset(i));
+ }
+ }
+ }
+
+ /**
+ * Get the header from a line with header markup
+ *
+ * @param line
+ * guaranteed to be a valid header as defined by b {@link #isHeader(String) isHeader(String)}
+ */
+ protected abstract String getHeaderText(String line);
+
+ /**
+ * @param project
+ * The fProject to set.
+ */
+ public void setProject(IProject project) {
+ fProject = project;
+ }
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.renderer;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditor;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+
+
+public interface IContentRenderer {
+ void forEachHeader(IDocument document, StructureClosure closure) throws BadLocationException;
+
+ // new interface methods
+ public void render(String content, StringBuffer buf, int level, boolean completeHTMLPage);
+ public void setProject(IProject project);
+}
\ No newline at end of file
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.renderer;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.core.resources.IProject;
+
+
+
+public final class RendererFactory {
+
+ private RendererFactory() {
+ super();
+ }
+
+ public static IContentRenderer createContentRenderer(IProject project) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
+ IContentRenderer renderer =(AbstractContentRenderer) Class.forName(getContentRendererName()).newInstance();
+ renderer.setProject(project);
+ return renderer;
+ }
+
+ public static String getContentRendererName() {
+ return WikipediaContentRenderer.class.getName();
+// return WikiEditorPlugin.getDefault().getPreferenceStore().getString(WikiConstants.BROWSER_RENDERER);
+ }
+
+}
--- /dev/null
+package net.sourceforge.phpeclipse.wiki.renderer;
+
+
+public interface StructureClosure {
+ /**
+ * @param header the text of the header without markup
+ * @param offset the offset in the document where the header is located
+ */
+ void acceptHeader(String header, int offset);
+}
--- /dev/null
+/*
+ * Thanks to Bent Andre Solheim for the improved header rendering.
+ */
+package net.sourceforge.phpeclipse.wiki.renderer;
+
+import java.io.IOException;
+import java.io.StringWriter;
+
+import net.sourceforge.phpeclipse.wiki.builder.BuilderRenderEngine;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.core.resources.IProject;
+import org.radeox.api.engine.RenderEngine;
+import org.radeox.api.engine.context.InitialRenderContext;
+import org.radeox.engine.context.BaseInitialRenderContext;
+import org.radeox.macro.MacroRepository;
+
+public final class WikipediaContentRenderer extends AbstractContentRenderer {
+ public static final String BULLET_MARKUP = "*";
+
+ public static final String ALT_BULLET_MARKUP = "-";
+
+ protected InitialRenderContext context;
+
+ protected BuilderRenderEngine engine;
+
+ protected void initialise() {
+
+ }
+
+ protected void appendHeader(String line) {
+ String header = getHeaderText(line);
+ String headerStartTag = "<h1 " + getHeaderCss(getHeaderSize(line)) + ">";
+ getBuffer().append(headerStartTag);
+ getBuffer().append(header);
+ getBuffer().append("</h1>");
+ }
+
+ private int getHeaderSize(String line) {
+ int size = 0;
+ int index = 0;
+ while (index < line.length() && line.charAt(index) != ' ') {
+ if (line.charAt(index) == '1') {
+ size++;
+ }
+ index++;
+ }
+ return size;
+ }
+
+ private String getHeaderCss(int size) {
+ int max = Math.min(3, size);
+ StringBuffer css = new StringBuffer();
+ css.append("class=\"").append("heading");
+ for (int i = 0; i < max; i++) {
+ css.append("-1");
+ }
+ css.append("\"");
+ return css.toString();
+ }
+
+ protected String getHeaderText(String line) {
+ return line.substring(line.indexOf(' ')).trim();
+ }
+
+ protected int getListDepth(String line) {
+ char bullet = getBullet(line);
+ for (int i = 0; i < line.length(); i++) {
+ if (line.charAt(i) != bullet) {
+ return i;
+ }
+ }
+ return line.length();
+ }
+
+ private char getBullet(String line) {
+ char bullet = line.startsWith(WikipediaContentRenderer.BULLET_MARKUP) ? WikipediaContentRenderer.BULLET_MARKUP.charAt(0)
+ : WikipediaContentRenderer.ALT_BULLET_MARKUP.charAt(0);
+ return bullet;
+ }
+
+ protected boolean isHeader(String line) {
+ return line.startsWith("1") && line.indexOf(' ') > 0;
+ }
+
+ protected boolean isList(String line) {
+ return !line.trim().equals("----")
+ && (line.startsWith(WikipediaContentRenderer.BULLET_MARKUP) || line.startsWith(WikipediaContentRenderer.ALT_BULLET_MARKUP));
+ }
+
+ protected boolean process(String line) {
+ if (line.trim().matches("^----*$")) {
+ appendHR();
+ return true;
+ }
+ return false;
+ }
+
+ protected String processTags(String line) {
+ line = line.replaceAll("\\\\", "<br>");
+ line = extractMacroMarkup(line);
+ line = replacePair(line, "__", "<b>", "</b>");
+ line = replacePair(line, "~~", "<i>", "</i>");
+ line = replacePair(line, "--", "<strike>", "</strike>");
+ return line;
+ }
+
+ private String extractMacroMarkup(String line) {
+ return line.replaceAll("\\{.*?\\}", "");
+ }
+
+ protected String getListtext(String line) {
+ return line.substring(getListDepth(line)).trim();
+ }
+
+ protected String getTableTag() {
+ return "<table class=\"wiki-table\" cellpadding=\"0\" cellspacing=\"0\" border=\"0\">";
+ }
+
+ public final void render(String content, StringBuffer buf, int level, boolean completeHTMLPage) {
+ try {
+ buffer = buf;
+ if (completeHTMLPage) {
+ appendHeader();
+ }
+ StringWriter writer = new StringWriter();
+ try {
+ engine.setLevel(level);
+ engine.render(writer, content, context);
+ buffer.append(writer);
+ } catch (IOException e) {
+ // never reach
+ }
+ if (completeHTMLPage) {
+ appendFooter();
+ }
+ // return buffer.toString();
+ } catch (Exception e) {
+ WikiEditorPlugin.getDefault().log(buffer.toString());
+ WikiEditorPlugin.getDefault().log(e.getLocalizedMessage(), e);
+ // return "<html><body><p>" + e.getLocalizedMessage() + "</p></body></html>";
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see net.sourceforge.phpeclipse.wiki.renderer.IContentRenderer#setProject(org.eclipse.core.resources.IProject)
+ */
+ public void setProject(IProject project) {
+ super.setProject(project);
+ context = new BaseInitialRenderContext();
+ engine = new BuilderRenderEngine(project, context);
+ context.setRenderEngine(engine);
+ MacroRepository repository = MacroRepository.getInstance();
+ repository.setInitialContext(context);
+ }
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.ui.internal;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.internal.IConfiguration;
+import net.sourceforge.phpeclipse.wiki.internal.IConfigurationWorkingCopy;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+/**
+ *
+ */
+public class ConfigurationComposite extends Composite {
+ protected Table table;
+ protected TableViewer tableViewer;
+
+ protected Button edit;
+ protected Button remove;
+ protected Button start;
+ protected Button stop;
+
+ protected List selection2;
+
+ public ConfigurationComposite(Composite parent, int style) {
+ super(parent, style);
+
+ createWidgets();
+ }
+
+ protected void createWidgets() {
+ GridLayout layout = new GridLayout();
+ layout.horizontalSpacing = 6;
+ layout.verticalSpacing = 6;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ layout.numColumns = 2;
+ setLayout(layout);
+
+ GridData data = new GridData(GridData.FILL_BOTH);
+ setLayoutData(data);
+
+ Label label = new Label(this, SWT.WRAP);
+ label.setText(WikiEditorPlugin.getResource("%configurationsList"));
+ label.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_CENTER));
+
+ label = new Label(this, SWT.NONE);
+
+ table = new Table(this, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
+ data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
+ data.widthHint = 300;
+// WorkbenchHelp.setHelp(table, ContextIds.PREF_MONITORS);
+
+ table.setLayoutData(data);
+ table.setHeaderVisible(true);
+ table.setLinesVisible(true);
+
+ TableLayout tableLayout = new TableLayout();
+
+ TableColumn statusColumn = new TableColumn(table, SWT.NONE);
+ statusColumn.setText(WikiEditorPlugin.getResource("%columnStatus"));
+ ColumnWeightData colData = new ColumnWeightData(6, 30, true);
+ tableLayout.addColumnData(colData);
+
+ TableColumn typeColumn = new TableColumn(table, SWT.NONE);
+ typeColumn.setText(WikiEditorPlugin.getResource("%columnType"));
+ colData = new ColumnWeightData(5, 30, true);
+ tableLayout.addColumnData(colData);
+
+ TableColumn urlColumn = new TableColumn(table, SWT.NONE);
+ urlColumn.setText(WikiEditorPlugin.getResource("%columnURL"));
+ colData = new ColumnWeightData(12, 150, true);
+ tableLayout.addColumnData(colData);
+
+ TableColumn localColumn = new TableColumn(table, SWT.NONE);
+ localColumn.setText(WikiEditorPlugin.getResource("%columnUser"));
+ colData = new ColumnWeightData(5, 50, true);
+ tableLayout.addColumnData(colData);
+
+ table.setLayout(tableLayout);
+
+ tableViewer = new TableViewer(table);
+ tableViewer.setContentProvider(new ConfigurationContentProvider());
+ tableViewer.setLabelProvider(new ConfigurationTableLabelProvider());
+ tableViewer.setInput("root");
+
+ tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+ public void selectionChanged(SelectionChangedEvent event) {
+ setSelection(event.getSelection());
+ }
+ });
+
+ Composite buttonComp = new Composite(this, SWT.NONE);
+ layout = new GridLayout();
+ layout.horizontalSpacing = 0;
+ layout.verticalSpacing = 8;
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ layout.numColumns = 1;
+ buttonComp.setLayout(layout);
+ data = new GridData(GridData.HORIZONTAL_ALIGN_END | GridData.VERTICAL_ALIGN_FILL);
+ buttonComp.setLayoutData(data);
+
+ Button add = SWTUtil.createButton(buttonComp, WikiEditorPlugin.getResource("%add"));
+ add.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ ConfigurationDialog dialog = new ConfigurationDialog(getShell());
+ if (dialog.open() == Window.CANCEL)
+ return;
+ tableViewer.refresh();
+
+ List list = WikiEditorPlugin.getConfigurations();
+ Object configuration = list.get(list.size() - 1);
+ tableViewer.setSelection(new StructuredSelection(configuration));
+ }
+ });
+
+ edit = SWTUtil.createButton(buttonComp, WikiEditorPlugin.getResource("%edit"));
+ edit.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ IConfiguration monitor = (IConfiguration) getSelection().get(0);
+ IConfigurationWorkingCopy wc = monitor.getWorkingCopy();
+
+ ConfigurationDialog dialog = new ConfigurationDialog(getShell(), wc);
+ if (dialog.open() != Window.CANCEL) {
+ try {
+ tableViewer.refresh(wc.save());
+ } catch (Exception ex) { }
+ }
+ }
+ });
+ edit.setEnabled(false);
+
+ remove = SWTUtil.createButton(buttonComp, WikiEditorPlugin.getResource("%remove"));
+ remove.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ Iterator iterator = getSelection().iterator();
+ while (iterator.hasNext()) {
+ IConfiguration monitor = (IConfiguration) iterator.next();
+ try {
+ monitor.delete();
+ } catch (Exception ex) { }
+ tableViewer.remove(monitor);
+
+ List list = WikiEditorPlugin.getConfigurations();
+ Object monitor2 = list.get(list.size() - 1);
+ tableViewer.setSelection(new StructuredSelection(monitor2));
+ }
+ }
+ });
+ remove.setEnabled(false);
+
+ start = SWTUtil.createButton(buttonComp, WikiEditorPlugin.getResource("%start"));
+ start.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ Iterator iterator = getSelection().iterator();
+ while (iterator.hasNext()) {
+ IConfiguration configuration = (IConfiguration) iterator.next();
+// try {
+// WikiEditorPlugin.startMonitor(monitor);
+// } catch (CoreException ce) {
+// MessageDialog.openError(getShell(), WikiEditorPlugin.getResource("%errorDialogTitle"), ce.getStatus().getMessage());
+// } catch (Exception ce) {
+// MessageDialog.openError(getShell(), WikiEditorPlugin.getResource("%errorDialogTitle"), ce.getMessage());
+// }
+ tableViewer.refresh(configuration, true);
+ }
+ tableViewer.setSelection(tableViewer.getSelection());
+ }
+ });
+ start.setEnabled(false);
+
+ stop = SWTUtil.createButton(buttonComp, WikiEditorPlugin.getResource("%stop"));
+ stop.addSelectionListener(new SelectionAdapter() {
+ public void widgetSelected(SelectionEvent e) {
+ Iterator iterator = getSelection().iterator();
+ while (iterator.hasNext()) {
+ IConfiguration monitor = (IConfiguration) iterator.next();
+ try {
+// WikiEditorPlugin.stopMonitor(monitor);
+ } catch (Exception ex) { }
+ tableViewer.refresh(monitor, true);
+ }
+ tableViewer.setSelection(tableViewer.getSelection());
+ }
+ });
+ stop.setEnabled(false);
+ }
+
+ protected List getSelection() {
+ return selection2;
+ }
+
+ protected void setSelection(ISelection sel2) {
+ IStructuredSelection sel = (IStructuredSelection) sel2;
+ Iterator iterator = sel.iterator();
+ selection2 = new ArrayList();
+
+ while (iterator.hasNext()) {
+ Object obj = iterator.next();
+ if (obj instanceof IConfiguration)
+ selection2.add(obj);
+ }
+
+ if (!selection2.isEmpty()) {
+ remove.setEnabled(true);
+
+ boolean allStopped = true;
+ boolean allStarted = true;
+
+ iterator = selection2.iterator();
+ while (iterator.hasNext()) {
+ IConfiguration monitor = (IConfiguration) iterator.next();
+ if (monitor.isActive())
+ allStopped = false;
+ else
+ allStarted = false;
+ }
+ start.setEnabled(allStopped);
+ stop.setEnabled(allStarted);
+ edit.setEnabled(selection2.size() == 1 && allStopped);
+ } else {
+ edit.setEnabled(false);
+ remove.setEnabled(false);
+ start.setEnabled(false);
+ stop.setEnabled(false);
+ }
+ }
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.ui.internal;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.internal.IConfiguration;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+/**
+ * Configuration content provider.
+ */
+public class ConfigurationContentProvider implements IStructuredContentProvider {
+ /**
+ * ConfigurationContentProvider constructor comment.
+ */
+ public ConfigurationContentProvider() {
+ super();
+ }
+
+ /**
+ * Disposes of this content provider.
+ * This is called by the viewer when it is disposed.
+ */
+ public void dispose() { }
+
+ /**
+ * Returns the elements to display in the viewer
+ * when its input is set to the given element.
+ * These elements can be presented as rows in a table, items in a list, etc.
+ * The result is not modified by the viewer.
+ *
+ * @param inputElement the input element
+ * @return the array of elements to display in the viewer
+ */
+ public Object[] getElements(Object inputElement) {
+ List list = new ArrayList();
+ Iterator iterator = WikiEditorPlugin.getConfigurations().iterator();
+ while (iterator.hasNext()) {
+ IConfiguration monitor = (IConfiguration) iterator.next();
+ list.add(monitor);
+ }
+ return list.toArray();
+ }
+
+ /**
+ * Notifies this content provider that the given viewer's input
+ * has been switched to a different element.
+ * <p>
+ * A typical use for this method is registering the content provider as a listener
+ * to changes on the new input (using model-specific means), and deregistering the viewer
+ * from the old input. In response to these change notifications, the content provider
+ * propagates the changes to the viewer.
+ * </p>
+ *
+ * @param viewer the viewer
+ * @param oldInput the old input element, or <code>null</code> if the viewer
+ * did not previously have an input
+ * @param newInput the new input element, or <code>null</code> if the viewer
+ * does not have an input
+ */
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {}
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.ui.internal;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.internal.IConfigurationWorkingCopy;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+/**
+ *
+ */
+public class ConfigurationDialog extends Dialog {
+ protected IConfigurationWorkingCopy fConfiguration;
+ protected boolean isEdit;
+
+ private Button okButton;
+ private Text fUserName;
+ private Text fUrl;
+ private Text fPassword;
+
+ interface StringModifyListener {
+ public void valueChanged(String s);
+ }
+
+ interface BooleanModifyListener {
+ public void valueChanged(boolean b);
+ }
+
+ interface TypeModifyListener {
+ public void valueChanged(String fType);
+ }
+
+ /**
+ * @param parentShell
+ */
+ public ConfigurationDialog(Shell parentShell, IConfigurationWorkingCopy configuration) {
+ super(parentShell);
+ this.fConfiguration = configuration;
+ isEdit = true;
+ }
+
+ public ConfigurationDialog(Shell parentShell) {
+ super(parentShell);
+ fConfiguration = WikiEditorPlugin.createConfiguration();
+ isEdit = false;
+ }
+
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ if (isEdit)
+ shell.setText(WikiEditorPlugin.getResource("%editConfig"));
+ else
+ shell.setText(WikiEditorPlugin.getResource("%newConfig"));
+ }
+
+ protected Label createLabel(Composite comp, String txt) {
+ Label label = new Label(comp, SWT.NONE);
+ label.setText(txt);
+ label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
+ return label;
+ }
+
+ protected Text createText(Composite comp, String txt, final StringModifyListener listener) {
+ final Text text = new Text(comp, SWT.BORDER);
+ if (txt != null)
+ text.setText(txt);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+ data.widthHint = 150;
+ text.setLayoutData(data);
+ if (listener != null)
+ text.addModifyListener(new ModifyListener() {
+ public void modifyText(ModifyEvent e) {
+ listener.valueChanged(text.getText());
+ }
+ });
+ return text;
+ }
+
+ protected Combo createTypeCombo(Composite comp, final String[] types, String sel, final TypeModifyListener listener) {
+ final Combo combo = new Combo(comp, SWT.DROP_DOWN | SWT.READ_ONLY);
+ int size = types.length;
+ String[] items = new String[size];
+ int index = -1;
+ for (int i = 0; i < size; i++) {
+ items[i] = types[i];
+ if (types[i].equals(sel))
+ index = i;
+ }
+ combo.setItems(items);
+ if (index >= 0)
+ combo.select(index);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
+ data.widthHint = 150;
+ combo.setLayoutData(data);
+ if (listener != null)
+ combo.addSelectionListener(new SelectionListener() {
+ public void widgetSelected(SelectionEvent e) {
+ listener.valueChanged(types[combo.getSelectionIndex()]);
+ }
+ public void widgetDefaultSelected(SelectionEvent e) {
+ widgetSelected(e);
+ }
+ });
+ return combo;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createDialogArea(Composite parent) {
+ Composite composite = (Composite) super.createDialogArea(parent);
+ ((GridLayout)composite.getLayout()).numColumns = 2;
+
+// WorkbenchHelp.setHelp(composite, ContextIds.PREF_DIALOG);
+
+ Group group = new Group(composite, SWT.NONE);
+ GridLayout layout = new GridLayout(2, false);
+ group.setLayout(layout);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL);
+ data.horizontalSpan = 2;
+ group.setLayoutData(data);
+ group.setText(WikiEditorPlugin.getResource("%remoteGroup"));
+
+ createLabel(group, WikiEditorPlugin.getResource("%url"));
+ fUrl = createText(group, fConfiguration.getURL(), new StringModifyListener() {
+ public void valueChanged(String s) {
+ fConfiguration.setURL(s);
+ validateFields();
+ }
+ });
+
+ createLabel(composite, WikiEditorPlugin.getResource("%user"));
+ fUserName = createText(composite, fConfiguration.getUser() + "", new StringModifyListener() {
+ public void valueChanged(String s) {
+ fConfiguration.setUser(s);
+ validateFields();
+ }
+ });
+
+ createLabel(group, WikiEditorPlugin.getResource("%password"));
+ fPassword = createText(group, fConfiguration.getPassword() + "", new StringModifyListener() {
+ public void valueChanged(String s) {
+ fConfiguration.setPassword(s);
+ validateFields();
+ }
+ });
+
+ createLabel(group, WikiEditorPlugin.getResource("%parseType"));
+ createTypeCombo(group, WikiEditorPlugin.getTypes(), fConfiguration.getType(), new TypeModifyListener() {
+ public void valueChanged(String fType) {
+ fConfiguration.setType(fType);
+ }
+ });
+
+ return composite;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+ */
+ protected void okPressed() {
+ fConfiguration.save();
+ super.okPressed();
+ }
+
+ protected Control createButtonBar(Composite parent) {
+ Control buttonControl = super.createButtonBar(parent);
+ validateFields();
+ return buttonControl;
+ }
+
+ private void setOKButtonEnabled(boolean curIsEnabled) {
+ if (okButton == null)
+ okButton = getButton(IDialogConstants.OK_ID);
+
+ if (okButton != null)
+ okButton.setEnabled(curIsEnabled);
+ }
+
+ protected void validateFields() {
+ boolean result = true;
+
+ String currHostname = fUrl.getText();
+// if (!isValidHostname(currHostname))
+// result = false;
+
+ String currHostnamePort = fPassword.getText();
+// try {
+// Integer.parseInt(currHostnamePort);
+// } catch (Exception any) {
+// result = false;
+// }
+
+ String currMonitorPort = fUserName.getText();
+// try {
+// Integer.parseInt(currMonitorPort);
+// } catch (Exception any) {
+// result = false;
+// }
+
+// if (result && isLocalhost(currHostname)) {
+// if (currHostnamePort.equals(currMonitorPort))
+// result = false;
+// }
+ setOKButtonEnabled(result);
+ }
+
+// protected static boolean isValidHostname(String host) {
+// if (host == null || host.trim().length() < 1)
+// return false;
+// if (host.indexOf("/") >= 0)
+// return false;
+// if (host.indexOf("\\") >= 0)
+// return false;
+// if (host.indexOf(" ") >= 0)
+// return false;
+// return true;
+// }
+
+// protected static boolean isLocalhost(String host) {
+// if (host == null)
+// return false;
+// try {
+// if ("localhost".equals(host) || "127.0.0.1".equals(host))
+// return true;
+// InetAddress localHostaddr = InetAddress.getLocalHost();
+// if (localHostaddr.getHostName().equals(host))
+// return true;
+// } catch (Exception e) {
+// Trace.trace(Trace.WARNING, "Error checking for localhost", e);
+// }
+// return false;
+// }
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.ui.internal;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+/**
+ * The preference page that holds monitor properties.
+ */
+public class ConfigurationPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+
+ /**
+ * ConfigurationPreferencePage constructor comment.
+ */
+ public ConfigurationPreferencePage() {
+ super();
+ noDefaultAndApplyButton();
+ }
+
+ /**
+ * Create the preference options.
+ *
+ * @param parent org.eclipse.swt.widgets.Composite
+ * @return org.eclipse.swt.widgets.Control
+ */
+ protected Control createContents(Composite parent) {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.numColumns = 1;
+ layout.horizontalSpacing = convertHorizontalDLUsToPixels(4);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(4);
+ layout.marginWidth = 0;
+ layout.marginHeight = 0;
+ composite.setLayout(layout);
+ GridData data = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_FILL);
+ composite.setLayoutData(data);
+// WorkbenchHelp.setHelp(composite, ContextIds.PREF);
+
+ Label label = new Label(composite, SWT.WRAP);
+ label.setText(WikiEditorPlugin.getResource("%preferenceDescription"));
+ data = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
+ label.setLayoutData(data);
+
+ label = new Label(composite, SWT.NONE);
+ label.setText("");
+
+ ConfigurationComposite monitorComp = new ConfigurationComposite(composite, SWT.NONE);
+ data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
+ monitorComp.setLayoutData(data);
+
+ Dialog.applyDialogFont(composite);
+
+ return composite;
+ }
+
+ /**
+ * Initializes this preference page using the passed desktop.
+ *
+ * @param desktop the current desktop
+ */
+ public void init(IWorkbench workbench) {
+ }
+
+ /**
+ * Performs special processing when this page's Defaults button has been pressed.
+ * <p>
+ * This is a framework hook method for sublcasses to do special things when
+ * the Defaults button has been pressed.
+ * Subclasses may override, but should call <code>super.performDefaults</code>.
+ * </p>
+ */
+ protected void performDefaults() {
+// displayButton.setSelection(WikiEditorPlugin.getDefaultShowOnActivityPreference());
+ super.performDefaults();
+ }
+
+ /**
+ * Method declared on IPreferencePage.
+ * Subclasses should override
+ */
+ public boolean performOk() {
+// WikiEditorPlugin.setShowOnActivityPreference(displayButton.getSelection());
+ WikiEditorPlugin.getDefault().savePluginPreferences();
+ return true;
+ }
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.ui.internal;
+
+import net.sourceforge.phpeclipse.webbrowser.internal.ContextIds;
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.internal.IConfigurationWorkingCopy;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.help.WorkbenchHelp;
+
+/**
+ *
+ */
+public class ConfigurationPrefrencesDialog extends Dialog {
+ protected IConfigurationWorkingCopy monitor;
+
+ protected boolean isEdit;
+
+ /**
+ * @param parentShell
+ */
+ public ConfigurationPrefrencesDialog(Shell parentShell, IConfigurationWorkingCopy monitor) {
+ super(parentShell);
+ this.monitor = monitor;
+ isEdit = true;
+ }
+
+ public ConfigurationPrefrencesDialog(Shell composite) {
+ super(composite);
+ isEdit = false;
+ }
+
+ protected void configureShell(Shell shell) {
+ super.configureShell(shell);
+ shell.setText(WikiEditorPlugin.getResource("%preferenceTitle"));
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+ */
+ protected Control createDialogArea(Composite parent) {
+ Composite compositeParent = (Composite) super.createDialogArea(parent);
+
+ Composite composite = new Composite(compositeParent, SWT.NONE);
+ GridLayout layout = new GridLayout();
+ layout.marginHeight = convertHorizontalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+ layout.marginWidth = convertVerticalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+ layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+ composite.setLayout(layout);
+ GridData data = new GridData(GridData.FILL_BOTH);
+ composite.setLayoutData(data);
+ // WorkbenchHelp.setHelp(composite, ContextIds.PREF);
+
+ ConfigurationComposite monitorComp = new ConfigurationComposite(composite, SWT.NONE);
+ data = new GridData(GridData.FILL_HORIZONTAL | GridData.FILL_VERTICAL);
+ monitorComp.setLayoutData(data);
+
+ Dialog.applyDialogFont(composite);
+
+ return composite;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.jface.dialogs.Dialog#okPressed()
+ */
+ protected void okPressed() {
+ WikiEditorPlugin.getDefault().savePluginPreferences();
+ super.okPressed();
+ }
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.ui.internal;
+
+import net.sourceforge.phpeclipse.wiki.editor.WikiEditorPlugin;
+import net.sourceforge.phpeclipse.wiki.internal.IConfiguration;
+
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.swt.graphics.Image;
+/**
+ * Configuration table label provider.
+ */
+public class ConfigurationTableLabelProvider implements ITableLabelProvider {
+ /**
+ * ConfigurationTableLabelProvider constructor comment.
+ */
+ public ConfigurationTableLabelProvider() {
+ super();
+ }
+
+ /**
+ * Adds a listener to this label provider.
+ * Has no effect if an identical listener is already registered.
+ * <p>
+ * Label provider listeners are informed about state changes
+ * that affect the rendering of the viewer that uses this label provider.
+ * </p>
+ *
+ * @param listener a label provider listener
+ */
+ public void addListener(ILabelProviderListener listener) { }
+
+ /**
+ * Disposes of this label provider. When a label provider is
+ * attached to a viewer, the viewer will automatically call
+ * this method when the viewer is being closed. When label providers
+ * are used outside of the context of a viewer, it is the client's
+ * responsibility to ensure that this method is called when the
+ * provider is no longer needed.
+ */
+ public void dispose() { }
+
+ /**
+ * Returns the label image for the given column of the given element.
+ *
+ * @param element the object representing the entire row, or
+ * <code>null</code> indicating that no input object is set
+ * in the viewer
+ * @param columnIndex the zero-based index of the column in which
+ * the label appears
+ */
+ public Image getColumnImage(Object element, int columnIndex) {
+ if (columnIndex == 0) {
+ IConfiguration monitor = (IConfiguration) element;
+ if (monitor.isActive())
+ return WikiEditorPlugin.getDefault().getImage(WikiEditorPlugin.IMG_MONITOR_ON);
+ else
+ return WikiEditorPlugin.getDefault().getImage(WikiEditorPlugin.IMG_MONITOR_OFF);
+ }
+ return null;
+ }
+
+ /**
+ * Returns the label text for the given column of the given element.
+ *
+ * @param element the object representing the entire row, or
+ * <code>null</code> indicating that no input object is set
+ * in the viewer
+ * @param columnIndex the zero-based index of the column in which the label appears
+ */
+ public String getColumnText(Object element, int columnIndex) {
+ IConfiguration monitor = (IConfiguration) element;
+ if (columnIndex == 0) {
+ if (monitor.isActive())
+ return WikiEditorPlugin.getResource("%started");
+ else
+ return WikiEditorPlugin.getResource("%stopped");
+ } else if (columnIndex == 1)
+ return monitor.getURL() + ":" + monitor.getPassword();
+ else if (columnIndex == 2)
+ return monitor.getType();
+ else if (columnIndex == 3)
+ return monitor.getUser();
+ else
+ return "X";
+ }
+
+ protected String notNull(String s) {
+ if (s != null)
+ return s;
+ else
+ return "";
+ }
+
+ /**
+ * Returns whether the label would be affected
+ * by a change to the given property of the given element.
+ * This can be used to optimize a non-structural viewer update.
+ * If the property mentioned in the update does not affect the label,
+ * then the viewer need not update the label.
+ *
+ * @param element the element
+ * @param property the property
+ * @return <code>true</code> if the label would be affected,
+ * and <code>false</code> if it would be unaffected
+ */
+ public boolean isLabelProperty(Object element, String property) {
+ return false;
+ }
+
+ /**
+ * Removes a listener to this label provider.
+ * Has no affect if an identical listener is not registered.
+ *
+ * @param listener a label provider listener
+ */
+ public void removeListener(ILabelProviderListener listener) { }
+}
\ No newline at end of file
--- /dev/null
+/**********************************************************************
+ * Copyright (c) 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM - Initial API and implementation
+ **********************************************************************/
+package net.sourceforge.phpeclipse.wiki.ui.internal;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.FontMetrics;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+/**
+ * SWT Utility class.
+ */
+public class SWTUtil {
+ private static FontMetrics fontMetrics;
+
+ protected static void initializeDialogUnits(Control testControl) {
+ // Compute and store a font metric
+ GC gc = new GC(testControl);
+ gc.setFont(JFaceResources.getDialogFont());
+ fontMetrics = gc.getFontMetrics();
+ gc.dispose();
+ }
+
+ /**
+ * Returns a width hint for a button control.
+ */
+ protected static int getButtonWidthHint(Button button) {
+ int widthHint = Dialog.convertHorizontalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_WIDTH);
+ return Math.max(widthHint, button.computeSize(SWT.DEFAULT, SWT.DEFAULT, true).x);
+ }
+
+ public static Button createButton(Composite comp, String label) {
+ Button b = new Button(comp, SWT.PUSH);
+ b.setText(label);
+ if (fontMetrics == null)
+ initializeDialogUnits(comp);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
+ data.widthHint = getButtonWidthHint(b);
+ data.heightHint = Dialog.convertVerticalDLUsToPixels(fontMetrics, IDialogConstants.BUTTON_HEIGHT);
+ b.setLayoutData(data);
+ return b;
+ }
+
+ public static Button createCheckbox(Composite comp, String txt, boolean isSelected){
+ Button button = new Button(comp, SWT.CHECK);
+ button.setText(txt);
+ GridLayout layout = new GridLayout();
+ comp.setLayout(layout);
+ GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_BEGINNING);
+ data.horizontalIndent = 10;
+ button.setLayoutData(data);
+ button.setSelection(isSelected);
+ return button;
+ }
+
+ public static Label createLabel(Composite comp, String txt) {
+ Label label = new Label(comp, SWT.NONE);
+ label.setText(txt);
+ label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING | GridData.VERTICAL_ALIGN_BEGINNING));
+ return label;
+ }
+}