summaryrefslogtreecommitdiff
path: root/scripting/java/org/openoffice/netbeans/modules/office
diff options
context:
space:
mode:
Diffstat (limited to 'scripting/java/org/openoffice/netbeans/modules/office')
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/Bundle.properties0
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/Bundle_en_US.properties0
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/BuildParcelAction.java69
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/CompileParcelAction.java44
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/ConfigureParcelAction.java70
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/DeployParcelAction.java244
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/MountDocumentAction.java85
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/MountParcelAction.java84
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/OfficeDocumentCookie.java42
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/OfficeDocumentSupport.java143
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelCookie.java42
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorEditorSupport.java141
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorParserCookie.java42
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorParserSupport.java121
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelFolderCookie.java42
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelFolderSupport.java257
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelSupport.java191
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/filesystem/Bundle.properties44
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/filesystem/Bundle_en_US.properties0
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/filesystem/OpenOfficeDocFileSystem.java1192
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/filesystem/OpenOfficeDocFileSystemBeanInfo.java125
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/Bundle.properties13
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataLoader.java112
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataLoaderBeanInfo.java72
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataNode.java120
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataObject.java58
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolder.java137
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolderDataLoader.java82
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolderDataLoaderBeanInfo.java76
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataLoader.java89
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataLoaderBeanInfo.java76
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataNode.java114
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataObject.java77
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataLoader.java91
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataLoaderBeanInfo.java76
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataNode.java81
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataObject.java83
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolder.java303
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolderDataLoader.java112
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolderDataLoaderBeanInfo.java76
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/nodes/OfficeDocumentChildren.java147
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/nodes/ParcelDescriptorChildren.java91
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/nodes/ScriptNode.java209
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/options/Bundle.properties14
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettings.java133
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsBeanInfo.java147
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon.gifbin0 -> 145 bytes
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon32.gifbin0 -> 253 bytes
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/AppStorage.html11
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/AppStorage.settings7
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/Bundle.properties24
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/EmptyParcel.html11
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon.gifbin0 -> 588 bytes
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon32.gifbin0 -> 759 bytes
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeSettings.settings9
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystem.html11
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystem.settings7
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon.pngbin0 -> 702 bytes
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon32.pngbin0 -> 1533 bytes
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/ParcelIcon.gifbin0 -> 576 bytes
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/ScriptParcel.html11
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/ScriptParcelDescriptor.html11
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/layer.xml98
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/mime-resolver.xml16
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/office-scripting.url1
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/templates/Empty.bsh_24
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/templates/Empty.java_27
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/templates/EmptyParcelDescriptor.xml_4
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/templates/HelloWorld.java_41
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/resources/templates/ParcelDescriptor.xml_8
-rwxr-xr-xscripting/java/org/openoffice/netbeans/modules/office/resources/webLink.gifbin0 -> 969 bytes
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/utils/FrameworkJarChecker.java140
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/utils/ManifestParser.java97
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/utils/NagDialog.java127
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/utils/OfficeModule.java68
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/utils/PackageRemover.java106
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/utils/ZipMounter.java92
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/Bundle.properties27
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/Bundle_en_US.properties0
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/InstallationPathDescriptor.java72
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/InstallationPathIterator.java136
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/JavaScriptIterator.java250
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelContentsIterator.java254
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesPanel.java117
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesVisualPanel.form74
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesVisualPanel.java157
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathPanel.java123
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathVisualPanel.form82
-rw-r--r--scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathVisualPanel.java196
89 files changed, 8006 insertions, 0 deletions
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/Bundle.properties b/scripting/java/org/openoffice/netbeans/modules/office/Bundle.properties
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/Bundle.properties
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/Bundle_en_US.properties b/scripting/java/org/openoffice/netbeans/modules/office/Bundle_en_US.properties
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/Bundle_en_US.properties
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/BuildParcelAction.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/BuildParcelAction.java
new file mode 100644
index 000000000000..a4863b271b42
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/BuildParcelAction.java
@@ -0,0 +1,69 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import java.util.Vector;
+import java.util.Enumeration;
+
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.RequestProcessor;
+import org.openide.actions.BuildAllAction;
+
+import org.openide.compiler.Compiler;
+import org.openide.compiler.CompilerJob;
+import org.openide.compiler.CompilerTask;
+
+import org.openoffice.netbeans.modules.office.utils.FrameworkJarChecker;
+
+public class BuildParcelAction extends BuildAllAction {
+ public String getName() {
+ return "Build";
+ }
+
+ protected void performAction(Node[] activatedNodes) {
+ FrameworkJarChecker.mountDependencies();
+
+ for (int i = 0; i < activatedNodes.length; i++) {
+ Vector v = new Vector(1);
+ v.addElement(activatedNodes[i]);
+
+ CompilerJob job = createJob(v.elements(), Compiler.DEPTH_INFINITE);
+ CompilerTask task = job.start();
+ task.waitFinished();
+
+ if (task.isSuccessful()) {
+ ParcelFolderCookie cookie = (ParcelFolderCookie)
+ activatedNodes[i].getCookie(ParcelFolderCookie.class);
+
+ if (cookie != null)
+ cookie.generate();
+ }
+ }
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/CompileParcelAction.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/CompileParcelAction.java
new file mode 100644
index 000000000000..3d5bbc1c0445
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/CompileParcelAction.java
@@ -0,0 +1,44 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import org.openide.nodes.Node;
+import org.openide.actions.CompileAllAction;
+
+import org.openoffice.netbeans.modules.office.utils.FrameworkJarChecker;
+
+public class CompileParcelAction extends CompileAllAction {
+ public String getName() {
+ return "Compile";
+ }
+
+ protected void performAction(Node[] activatedNodes) {
+ FrameworkJarChecker.mountDependencies();
+ super.performAction(activatedNodes);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/ConfigureParcelAction.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/ConfigureParcelAction.java
new file mode 100644
index 000000000000..b6b5c88809b2
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ConfigureParcelAction.java
@@ -0,0 +1,70 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.RequestProcessor;
+import org.openide.util.actions.CookieAction;
+
+import org.openoffice.netbeans.modules.office.utils.FrameworkJarChecker;
+
+public class ConfigureParcelAction extends CookieAction {
+
+ public java.lang.String getName() {
+ return "Configure";
+ }
+
+ protected java.lang.Class[] cookieClasses() {
+ return new Class[] {ParcelFolderCookie.class};
+ }
+
+ protected int mode() {
+ return CookieAction.MODE_EXACTLY_ONE;
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ protected void performAction(final Node[] activatedNodes)
+ {
+ FrameworkJarChecker.mountDependencies();
+
+ RequestProcessor.getDefault().post(new Runnable() {
+ public void run() {
+ for (int i = 0; i < activatedNodes.length; i++) {
+ ParcelFolderCookie pfc = (ParcelFolderCookie)
+ activatedNodes[i].getCookie(ParcelFolderCookie.class);
+ if (pfc != null)
+ pfc.configure();
+ }
+ }
+ });
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/DeployParcelAction.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/DeployParcelAction.java
new file mode 100644
index 000000000000..f66922801a22
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/DeployParcelAction.java
@@ -0,0 +1,244 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Enumeration;
+
+import javax.swing.JMenuItem;
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileFilter;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
+
+import org.openide.TopManager;
+import org.openide.NotifyDescriptor;
+import org.openide.awt.Actions;
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.RequestProcessor;
+import org.openide.util.actions.*;
+import org.openide.awt.JMenuPlus;
+
+import org.openoffice.idesupport.SVersionRCFile;
+import org.openoffice.idesupport.OfficeInstallation;
+import org.openoffice.idesupport.zip.ParcelZipper;
+import org.openoffice.idesupport.LocalOffice;
+
+import org.openoffice.netbeans.modules.office.utils.NagDialog;
+import org.openoffice.netbeans.modules.office.options.OfficeSettings;
+
+public class DeployParcelAction extends CookieAction implements Presenter.Popup {
+
+ private static final String BROWSE_LABEL = "Office Document...";
+ private static final String DEPLOY_LABEL = "Deploy To";
+
+ public String getName () {
+ return DEPLOY_LABEL;
+ }
+
+ public HelpCtx getHelpCtx () {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ public JMenuItem getPopupPresenter() {
+ JMenuPlus menu = new JMenuPlus(DEPLOY_LABEL);
+ JMenuItem item, user, share;
+ final OfficeInstallation oi = OfficeSettings.getDefault().getOfficeDirectory();
+
+ ActionListener listener = new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ JMenuItem choice = (JMenuItem)e.getSource();
+ String label = choice.getText();
+
+ Node[] nodes = getActivatedNodes();
+ final ParcelCookie parcelCookie =
+ (ParcelCookie)nodes[0].getCookie(ParcelCookie.class);
+
+ File target = new File(oi.getPath(File.separator + label +
+ File.separator + "Scripts"));
+
+ File langdir = new File(target, parcelCookie.getLanguage());
+
+ if (!langdir.exists()) {
+ boolean response = askIfCreateDirectory(langdir);
+ if (response == false) {
+ return;
+ }
+ }
+
+ deploy(target);
+ }
+ };
+
+ user = new JMenuItem("user");
+ user.addActionListener(listener);
+
+ share = new JMenuItem("share");
+ share.addActionListener(listener);
+
+ item = new JMenuPlus(oi.getName());
+ item.add(user);
+ item.add(share);
+ menu.add(item);
+
+ menu.addSeparator();
+ item = new JMenuItem(BROWSE_LABEL);
+ item.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ File target = getTargetFile();
+ if (target == null)
+ return;
+ deploy(target);
+ }
+ });
+ menu.add(item);
+
+ return menu;
+ }
+
+ protected int mode () {
+ return MODE_ONE;
+ }
+
+ protected Class[] cookieClasses () {
+ return new Class[] { ParcelCookie.class };
+ }
+
+ protected void performAction (Node[] activatedNodes) {
+ // do nothing, should not happen
+ }
+
+ private void deploy(final File target) {
+ Node[] nodes = getActivatedNodes();
+ final ParcelCookie parcelCookie =
+ (ParcelCookie)nodes[0].getCookie(ParcelCookie.class);
+
+ RequestProcessor.getDefault().post(new Runnable() {
+ public void run() {
+ boolean result = parcelCookie.deploy(target);
+
+ if (result == true && target.isDirectory()) {
+ showNagDialog();
+ // refreshOffice((String)versions.get(label));
+ }
+ }
+ });
+ }
+
+ private boolean askIfCreateDirectory(File directory) {
+ String message = directory.getAbsolutePath() + " does not exist. " +
+ "Do you want to create it now?";
+
+ NotifyDescriptor d = new NotifyDescriptor.Confirmation(
+ message, NotifyDescriptor.OK_CANCEL_OPTION);
+ TopManager.getDefault().notify(d);
+
+ if (d.getValue() == NotifyDescriptor.CANCEL_OPTION)
+ return false;
+
+ boolean result;
+ try {
+ result = directory.mkdirs();
+ }
+ catch (SecurityException se) {
+ result = false;
+ }
+
+ if (result == false) {
+ String tmp = "Error creating: " + directory.getAbsolutePath();
+ NotifyDescriptor d2 = new NotifyDescriptor.Message(
+ tmp, NotifyDescriptor.ERROR_MESSAGE);
+ TopManager.getDefault().notify(d2);
+ }
+ return result;
+ }
+
+ private void refreshOffice(String path) {
+ ClassLoader syscl = TopManager.getDefault().currentClassLoader();
+ LocalOffice office = LocalOffice.create(syscl, path, 8100);
+ office.refreshStorage("file://" + path + "/program/../user");
+ office.disconnect();
+ }
+
+ private void showNagDialog() {
+ String message = "If you currently have Office running you will " +
+ "need to click on the Tools/Scripting Add-on's/Refresh All Scripts " +
+ " menu item in Office so that the scripts in this parcel can be detected.";
+
+ OfficeSettings settings = OfficeSettings.getDefault();
+
+ if (settings.getWarnAfterDirDeploy() == true) {
+ NagDialog warning = NagDialog.createInformationDialog(
+ message, "Show this message in future", true);
+
+ warning.show();
+
+ if (warning.getState() == false)
+ settings.setWarnAfterDirDeploy(false);
+ }
+ }
+
+ private File getTargetFile() {
+ File target = null;
+
+ JFileChooser chooser = new JFileChooser();
+ chooser.setDialogTitle("Deploy Parcel To Office Document");
+ chooser.setApproveButtonText("Deploy");
+ chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
+ chooser.setFileFilter(new FileFilter() {
+ public boolean accept(File file) {
+ if (file.isDirectory() ||
+ file.getName().endsWith(".sxw") ||
+ file.getName().endsWith(".sxc") ||
+ file.getName().endsWith(".sxd") ||
+ file.getName().endsWith(".sxi"))
+ return true;
+ return false;
+ }
+
+ public String getDescription() {
+ return "Office Documents";
+ }
+ });
+
+ int result = chooser.showDialog(null, null);
+
+ if (result == JFileChooser.APPROVE_OPTION) {
+ target = chooser.getSelectedFile();
+ }
+ return target;
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/MountDocumentAction.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/MountDocumentAction.java
new file mode 100644
index 000000000000..775caf05bd51
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/MountDocumentAction.java
@@ -0,0 +1,85 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.RequestProcessor;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author adams
+ * @version 1.0
+ */
+public class MountDocumentAction extends CookieAction
+{
+ public MountDocumentAction()
+ {
+ }
+
+ public java.lang.String getName()
+ {
+ return "Mount Document"; //NOI18N
+ }
+
+ public HelpCtx getHelpCtx()
+ {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ protected int mode()
+ {
+ // enable duplication for as many qualifying nodes as are selected:
+ return CookieAction.MODE_ALL;
+ }
+
+ protected java.lang.Class[] cookieClasses()
+ {
+ // just the DuplicateCookie:
+ return new Class[] {OfficeDocumentCookie.class};
+ }
+
+ protected void performAction(final Node[] activatedNodes)
+ {
+ RequestProcessor.getDefault().post(new Runnable()
+ {
+ public void run()
+ {
+ for (int i=0; i<activatedNodes.length; i++)
+ {
+ OfficeDocumentCookie cookie = (OfficeDocumentCookie)activatedNodes[i].getCookie(OfficeDocumentCookie.class);
+ if (cookie != null)
+ {
+ cookie.mount();
+ }
+ }
+ }
+ });
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/MountParcelAction.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/MountParcelAction.java
new file mode 100644
index 000000000000..7b07c2d098f3
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/MountParcelAction.java
@@ -0,0 +1,84 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import org.openide.nodes.Node;
+import org.openide.util.HelpCtx;
+import org.openide.util.RequestProcessor;
+import org.openide.util.actions.CookieAction;
+
+/**
+ *
+ * @author adams
+ * @version 1.0
+ */
+public class MountParcelAction extends CookieAction
+{
+ public MountParcelAction()
+ {
+ }
+
+ public java.lang.String getName()
+ {
+ return "Mount Parcel"; //NOI18N
+ }
+
+ public HelpCtx getHelpCtx()
+ {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ protected int mode()
+ {
+ // enable duplication for as many qualifying nodes as are selected:
+ return CookieAction.MODE_ALL;
+ }
+
+ protected java.lang.Class[] cookieClasses()
+ {
+ return new Class[] {ParcelCookie.class};
+ }
+
+ protected void performAction(final Node[] activatedNodes)
+ {
+ RequestProcessor.getDefault().post(new Runnable()
+ {
+ public void run()
+ {
+ for (int i=0; i<activatedNodes.length; i++)
+ {
+ ParcelCookie mpc = (ParcelCookie)activatedNodes[i].getCookie(ParcelCookie.class);
+ if (mpc != null)
+ {
+ mpc.mount();
+ }
+ }
+ }
+ });
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/OfficeDocumentCookie.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/OfficeDocumentCookie.java
new file mode 100644
index 000000000000..2799b08f2af1
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/OfficeDocumentCookie.java
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import java.util.Enumeration;
+import javax.swing.event.ChangeListener;
+import org.openide.nodes.Node;
+
+public interface OfficeDocumentCookie extends Node.Cookie
+{
+ public void mount();
+ public Enumeration getParcels();
+ public void removeParcel(String name);
+
+ public void addChangeListener(ChangeListener cl);
+ public void removeChangeListener(ChangeListener cl);
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/OfficeDocumentSupport.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/OfficeDocumentSupport.java
new file mode 100644
index 000000000000..0be80d6786b7
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/OfficeDocumentSupport.java
@@ -0,0 +1,143 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import java.io.IOException;
+import java.io.File;
+import java.beans.PropertyVetoException;
+import java.util.Enumeration;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Iterator;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.ChangeEvent;
+
+import org.openide.ErrorManager;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+import org.openide.filesystems.FileChangeListener;
+import org.openide.filesystems.FileEvent;
+import org.openide.filesystems.FileAttributeEvent;
+import org.openide.filesystems.FileRenameEvent;
+import org.openide.cookies.OpenCookie;
+
+import org.openoffice.idesupport.OfficeDocument;
+
+import org.openoffice.netbeans.modules.office.options.OfficeSettings;
+import org.openoffice.netbeans.modules.office.loader.OfficeDocumentDataObject;
+import org.openoffice.netbeans.modules.office.utils.ZipMounter;
+import org.openoffice.netbeans.modules.office.utils.ManifestParser;
+
+public class OfficeDocumentSupport implements OfficeDocumentCookie, OpenCookie, FileChangeListener
+{
+ protected OfficeDocumentDataObject dataObj;
+ private boolean isMounted = false;
+ private OfficeDocument document;
+ private Set listeners;
+
+ public OfficeDocumentSupport(OfficeDocumentDataObject dataObj) {
+ this.dataObj = dataObj;
+ FileObject fo = dataObj.getPrimaryFile();
+ try {
+ this.document = new OfficeDocument(FileUtil.toFile(fo));
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ }
+ fo.addFileChangeListener(this);
+ }
+
+ public void mount() {
+ File file = FileUtil.toFile(dataObj.getPrimaryFile());
+
+ try {
+ ZipMounter.getZipMounter().mountZipFile(file);
+ isMounted = true;
+ }
+ catch (IOException ioe) {
+ ErrorManager.getDefault().notify(ioe);
+ }
+ catch (PropertyVetoException pve) {
+ ErrorManager.getDefault().notify(pve);
+ }
+ }
+
+ public void open () {
+ File file = FileUtil.toFile(dataObj.getPrimaryFile());
+
+ OfficeSettings settings = OfficeSettings.getDefault();
+ File soffice = new File(settings.getOfficeDirectory().getPath(
+ File.separator + "soffice"));
+
+ try {
+ Process p = Runtime.getRuntime ().exec (new String[] {
+ soffice.getAbsolutePath(), file.getAbsolutePath ()
+ });
+ } catch (IOException ioe) {
+ ErrorManager.getDefault().notify(ioe);
+ }
+ }
+
+ public Enumeration getParcels() {
+ return document.getParcels();
+ }
+
+ public void removeParcel(String name) {
+ document.removeParcel(name);
+ dataObj.getPrimaryFile().refresh(true);
+ }
+
+ public void addChangeListener(ChangeListener cl) {
+ if (listeners == null)
+ listeners = new HashSet();
+
+ listeners.add(cl);
+ }
+
+ public void removeChangeListener(ChangeListener cl) {
+ if (listeners == null)
+ return;
+
+ listeners.remove(cl);
+ }
+
+ public void fileChanged(FileEvent fe) {
+ if (listeners != null) {
+ Iterator iter = listeners.iterator();
+
+ while (iter.hasNext())
+ ((ChangeListener)iter.next()).stateChanged(new ChangeEvent(this));
+ }
+ }
+
+ public void fileAttributeChanged(FileAttributeEvent fe) {}
+ public void fileDataCreated(FileEvent fe) {}
+ public void fileDeleted(FileEvent fe) {}
+ public void fileFolderCreated(FileEvent fe) {}
+ public void fileRenamed(FileRenameEvent fe) {}
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelCookie.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelCookie.java
new file mode 100644
index 000000000000..23ace1c11160
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelCookie.java
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import java.io.File;
+import org.openide.nodes.Node;
+
+public interface ParcelCookie extends Node.Cookie
+{
+ public File getFile();
+
+ public String getLanguage();
+
+ public void mount();
+
+ public boolean deploy(File target);
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorEditorSupport.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorEditorSupport.java
new file mode 100644
index 000000000000..5f9f67dcfe60
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorEditorSupport.java
@@ -0,0 +1,141 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import java.io.IOException;
+
+import org.openide.cookies.*;
+import org.openide.filesystems.FileLock;
+import org.openide.filesystems.FileObject;
+import org.openide.loaders.DataObject;
+import org.openide.text.DataEditorSupport;
+import org.openide.windows.CloneableOpenSupport;
+
+import org.openoffice.netbeans.modules.office.loader.ParcelDescriptorDataObject;
+
+/** Support for editing a data object as text.
+ *
+ * @author tomaso
+ */
+// Replace OpenCookie with EditCookie or maybe ViewCookie as desired:
+public class ParcelDescriptorEditorSupport extends DataEditorSupport implements EditorCookie, OpenCookie, CloseCookie, PrintCookie {
+
+ /** Create a new editor support.
+ * @param obj the data object whose primary file will be edited as text
+ */
+ public ParcelDescriptorEditorSupport(ParcelDescriptorDataObject obj) {
+ super(obj, new ParcelDescriptorEnv(obj));
+ // Set a MIME type as needed, e.g.:
+ setMIMEType("text/xml");
+ }
+
+ /** Called when the document is modified.
+ * Here, adding a save cookie to the object and marking it modified.
+ * @return true if the modification is acceptable
+ */
+ protected boolean notifyModified() {
+ if (!super.notifyModified()) {
+ return false;
+ }
+ ParcelDescriptorDataObject obj = (ParcelDescriptorDataObject)getDataObject();
+ if (obj.getCookie(SaveCookie.class) == null) {
+ obj.setModified(true);
+ // You must implement this method on the object:
+ obj.addSaveCookie(new Save());
+ }
+ return true;
+ }
+
+ /** Called when the document becomes unmodified.
+ * Here, removing the save cookie from the object and marking it unmodified.
+ */
+ protected void notifyUnmodified() {
+ ParcelDescriptorDataObject obj = (ParcelDescriptorDataObject)getDataObject();
+ SaveCookie save = (SaveCookie)obj.getCookie(SaveCookie.class);
+ if (save != null) {
+ // You must implement this method on the object:
+ obj.removeSaveCookie(save);
+ obj.setModified(false);
+ }
+ super.notifyUnmodified();
+ }
+
+ /** A save cookie to use for the editor support.
+ * When saved, saves the document to disk and marks the object unmodified.
+ */
+ private class Save implements SaveCookie {
+ public void save() throws IOException {
+ saveDocument();
+ getDataObject().setModified(false);
+ }
+ }
+
+ /** A description of the binding between the editor support and the object.
+ * Note this may be serialized as part of the window system and so
+ * should be static, and use the transient modifier where needed.
+ */
+ private static class ParcelDescriptorEnv extends DataEditorSupport.Env {
+
+ //private static final long serialVersionUID = ...L;
+
+ /** Create a new environment based on the data object.
+ * @param obj the data object to edit
+ */
+ public ParcelDescriptorEnv(ParcelDescriptorDataObject obj) {
+ super(obj);
+ }
+
+ /** Get the file to edit.
+ * @return the primary file normally
+ */
+ protected FileObject getFile() {
+ return getDataObject().getPrimaryFile();
+ }
+
+ /** Lock the file to edit.
+ * Should be taken from the file entry if possible, helpful during
+ * e.g. deletion of the file.
+ * @return a lock on the primary file normally
+ * @throws IOException if the lock could not be taken
+ */
+ protected FileLock takeLock() throws IOException {
+ return ((ParcelDescriptorDataObject)getDataObject()).getPrimaryEntry().takeLock();
+ }
+
+ /** Find the editor support this environment represents.
+ * Note that we have to look it up, as keeping a direct
+ * reference would not permit this environment to be serialized.
+ * @return the editor support
+ */
+ public CloneableOpenSupport findCloneableOpenSupport() {
+ return (ParcelDescriptorEditorSupport)getDataObject().getCookie(ParcelDescriptorEditorSupport.class);
+ }
+
+ }
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorParserCookie.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorParserCookie.java
new file mode 100644
index 000000000000..925a451efe21
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorParserCookie.java
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import org.w3c.dom.NodeList;
+import javax.swing.event.ChangeListener;
+import org.openide.nodes.Node;
+
+public interface ParcelDescriptorParserCookie extends Node.Cookie
+{
+ // should return a NodeList of org.w3c.dom.Element
+ public NodeList getScriptElements();
+
+ public void addChangeListener(ChangeListener cl);
+
+ public void removeChangeListener(ChangeListener cl);
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorParserSupport.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorParserSupport.java
new file mode 100644
index 000000000000..aae9c51b5726
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorParserSupport.java
@@ -0,0 +1,121 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import java.io.*;
+import java.util.*;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.ChangeEvent;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import org.openide.filesystems.*;
+import org.openide.xml.XMLUtil;
+
+public class ParcelDescriptorParserSupport
+ implements ParcelDescriptorParserCookie, FileChangeListener
+{
+ private FileObject fo;
+ private Document document;
+ private Set listeners;
+
+ public ParcelDescriptorParserSupport(FileObject fo)
+ {
+ this.fo = fo;
+ fo.addFileChangeListener(this);
+ }
+
+ private synchronized void parseFile()
+ {
+ File file = FileUtil.toFile(fo);
+ InputSource is;
+
+ try {
+ is = new InputSource(new FileInputStream(file));
+ }
+ catch (FileNotFoundException fnfe) {
+ System.out.println("Couldn't find file: " + file.getName());
+ return;
+ }
+
+ document = null;
+ try {
+ document = XMLUtil.parse(is, false, false, null, null);
+ }
+ catch (IOException ioe) {
+ System.out.println("IO Error parsing file: " + file.getName());
+ }
+ catch (SAXException se) {
+ System.out.println("Sax Error parsing file: " + file.getName());
+ }
+ }
+
+ public synchronized NodeList getScriptElements()
+ {
+ if (document == null)
+ parseFile();
+
+ if (document != null)
+ return document.getElementsByTagName("script");
+ return null;
+ }
+
+ public void addChangeListener(ChangeListener cl) {
+ if (listeners == null)
+ listeners = new HashSet();
+
+ listeners.add(cl);
+ }
+
+ public void removeChangeListener(ChangeListener cl) {
+ if (listeners == null)
+ return;
+
+ listeners.remove(cl);
+ }
+
+ public void fileChanged(FileEvent fe) {
+ parseFile();
+
+ if (listeners != null) {
+ Iterator iter = listeners.iterator();
+
+ while (iter.hasNext())
+ ((ChangeListener)iter.next()).stateChanged(new ChangeEvent(this));
+ }
+ }
+
+ public void fileAttributeChanged(FileAttributeEvent fe) {}
+ public void fileDataCreated(FileEvent fe) {}
+ public void fileDeleted(FileEvent fe) {}
+ public void fileFolderCreated(FileEvent fe) {}
+ public void fileRenamed(FileRenameEvent fe) {}
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelFolderCookie.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelFolderCookie.java
new file mode 100644
index 000000000000..714204ffde41
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelFolderCookie.java
@@ -0,0 +1,42 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import org.openide.nodes.Node;
+
+public interface ParcelFolderCookie extends Node.Cookie
+{
+ public void generate();
+
+ public boolean configure();
+
+ public void setClasspath(String value);
+ public String getClasspath();
+
+ public String getLanguage();
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelFolderSupport.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelFolderSupport.java
new file mode 100644
index 000000000000..6644b0e66d44
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelFolderSupport.java
@@ -0,0 +1,257 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import java.util.Vector;
+import java.util.StringTokenizer;
+
+import java.io.*;
+import java.beans.PropertyVetoException;
+import java.awt.Dialog;
+
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+import org.openide.TopManager;
+import org.openide.DialogDescriptor;
+import org.openide.ErrorManager;
+import org.openide.xml.XMLUtil;
+import org.openide.execution.NbClassPath;
+
+import org.openide.cookies.OpenCookie;
+import org.openide.loaders.DataObject;
+import org.openide.loaders.DataNode;
+
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.JarFileSystem;
+import org.openide.filesystems.FileUtil;
+import org.openide.filesystems.Repository;
+
+import org.openide.nodes.*;
+import org.openide.windows.OutputWriter;
+
+import org.openoffice.netbeans.modules.office.loader.ParcelFolder;
+import org.openoffice.netbeans.modules.office.options.OfficeSettings;
+import org.openoffice.netbeans.modules.office.utils.ManifestParser;
+
+import com.sun.star.script.framework.container.ParcelDescriptor;
+
+import org.openoffice.idesupport.zip.ParcelZipper;
+import org.openoffice.idesupport.filter.FileFilter;
+import org.openoffice.idesupport.ui.ConfigurePanel;
+
+public class ParcelFolderSupport implements ParcelFolderCookie
+{
+ protected ParcelFolder parcelFolder;
+ private ConfigurePanel configuror = null;
+
+ public ParcelFolderSupport(ParcelFolder parcelFolder) {
+ this.parcelFolder = parcelFolder;
+ }
+
+ public String getLanguage() {
+ ParcelDescriptor descriptor = getParcelDescriptor();
+
+ if (descriptor == null) {
+ return "";
+ }
+ else {
+ return descriptor.getLanguage();
+ }
+ }
+
+ public String getClasspath() {
+ ParcelDescriptor descriptor = getParcelDescriptor();
+
+ if (descriptor == null) {
+ return "";
+ }
+ else {
+ return descriptor.getLanguageProperty("classpath");
+ }
+ }
+
+ public void setClasspath(String value) {
+ ParcelDescriptor descriptor = getParcelDescriptor();
+
+ if (descriptor != null) {
+ descriptor.setLanguageProperty("classpath", value);
+
+ try {
+ descriptor.write();
+ }
+ catch (IOException ioe) {
+ ErrorManager.getDefault().notify(ioe);
+ }
+ }
+ }
+
+ private ParcelDescriptor getParcelDescriptor() {
+ FileObject primary = parcelFolder.getPrimaryFile();
+
+ File contents = FileUtil.toFile(
+ primary.getFileObject(ParcelZipper.CONTENTS_DIRNAME));
+
+ return ParcelDescriptor.getParcelDescriptor(contents);
+ }
+
+ public void generate() {
+ ParcelFolder.ParcelFolderNode node =
+ (ParcelFolder.ParcelFolderNode)parcelFolder.getNodeDelegate();
+
+ FileObject parcelBase = parcelFolder.getPrimaryFile();
+ FileObject contentsBase =
+ parcelBase.getFileObject(ParcelZipper.CONTENTS_DIRNAME);
+
+ File parcelDir = FileUtil.toFile(parcelBase);
+ File contentsDir = FileUtil.toFile(contentsBase);
+
+ // The Location property is not displayed so just
+ // use the Parcel Recipe directory as the target directory
+ File targetDir = FileUtil.toFile(parcelFolder.getPrimaryFile());
+ File targetfile = new File(targetDir, File.separator +
+ parcelBase.getName() + "." + ParcelZipper.PARCEL_EXTENSION);
+
+ boolean proceed = configure();
+ if (proceed == false) {
+ return;
+ }
+
+ final OutputWriter out =
+ ParcelSupport.getOutputWindowWriter(parcelDir.getName() + " (generating)");
+ try {
+ out.println("Generating: " + parcelDir.getName(), null);
+ ParcelZipper.getParcelZipper().zipParcel(contentsDir, targetfile, node.getFileFilter());
+ out.println("\nGENERATION SUCCESSFUL.");
+ out.println("\nRight click on the generated parcel to deploy it");
+
+ if (targetDir.equals(parcelDir)) {
+ parcelBase.refresh(true);
+ }
+ }
+ catch (IOException ioe) {
+ out.println("GENERATION FAILED: reason: " + ioe.getClass().getName() + ": "+ ioe.getMessage());
+ }
+ finally
+ {
+ if( out != null)
+ {
+ out.close();
+ }
+ }
+ }
+
+ public boolean configure() {
+
+ FileObject primary = parcelFolder.getPrimaryFile();
+
+ File contents = FileUtil.toFile(
+ primary.getFileObject(ParcelZipper.CONTENTS_DIRNAME));
+
+ Vector classpath = getConfigureClasspath();
+ classpath.addElement(contents.getAbsolutePath());
+
+ try {
+ ParcelDescriptor descriptor = getParcelDescriptor();
+ if (descriptor == null) {
+ descriptor = ParcelDescriptor.createParcelDescriptor(contents);
+ }
+
+ if (configuror == null) {
+ configuror = new ConfigurePanel(contents.getAbsolutePath(),
+ classpath, descriptor);
+ }
+ else {
+ configuror.reload(contents.getAbsolutePath(), classpath,
+ descriptor);
+ }
+ }
+ catch (IOException ioe) {
+ ErrorManager.getDefault().notify(ioe);
+ return false;
+ }
+
+ DialogDescriptor dd = new DialogDescriptor(configuror,
+ ConfigurePanel.DIALOG_TITLE);
+
+ Dialog dialog = TopManager.getDefault().createDialog(dd);
+ dialog.show();
+
+ if (dd.getValue() == DialogDescriptor.OK_OPTION) {
+ try {
+ ParcelDescriptor descriptor = configuror.getConfiguration();
+ descriptor.write();
+ }
+ catch (Exception e) {
+ ErrorManager.getDefault().notify(e);
+ }
+ }
+ else {
+ return false;
+ }
+ return true;
+ }
+
+ private Vector getConfigureClasspath() {
+ Vector result = new Vector();
+
+ String classpath = NbClassPath.createRepositoryPath().getClassPath();
+ if ( System.getProperty( "os.name" ).startsWith( "Windows" ) )
+ {
+ // under windows path is enclosed by quotes
+ // e.g. C:\path1;d:\path2 would appear as
+ // "C:\path1;d:\path2" therefore for us
+ // we need to remove 1 character at either end of the
+ // classpath returned from "createRepositoryPath().getClassPath()"
+
+ if ( classpath.startsWith("\"") && classpath.endsWith("\"") )
+ {
+ StringBuffer buff = new StringBuffer(classpath);
+ buff.delete(0,1);
+ buff.delete( buff.length() - 1, buff.length() );
+ classpath = buff.toString();
+ }
+ }
+ StringTokenizer tokens = new StringTokenizer(classpath, File.pathSeparator);
+
+ while(tokens.hasMoreTokens())
+ result.addElement(tokens.nextToken());
+
+ OfficeSettings settings = OfficeSettings.getDefault();
+ File classesDir = new File(settings.getOfficeDirectory().getPath(
+ File.separator + "program" + File.separator + "classes"));
+ File[] jarfiles = classesDir.listFiles();
+
+ for (int i = 0; i < jarfiles.length; i++)
+ result.addElement(jarfiles[i].getAbsolutePath());
+
+ return result;
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelSupport.java b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelSupport.java
new file mode 100644
index 000000000000..5c9fa8b02789
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelSupport.java
@@ -0,0 +1,191 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.actions;
+
+import java.io.File;
+import java.io.IOException;
+import java.beans.PropertyVetoException;
+import java.util.Enumeration;
+import java.util.Calendar;
+
+import org.openide.TopManager;
+import org.openide.NotifyDescriptor;
+import org.openide.windows.OutputWriter;
+import org.openide.windows.InputOutput;
+
+import org.openide.ErrorManager;
+import org.openide.nodes.Node;
+import org.openide.filesystems.Repository;
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+import org.openide.filesystems.FileEvent;
+
+import org.openoffice.idesupport.zip.ParcelZipper;
+
+import org.openoffice.netbeans.modules.office.options.OfficeSettings;
+import org.openoffice.netbeans.modules.office.utils.NagDialog;
+import org.openoffice.netbeans.modules.office.utils.ZipMounter;
+import org.openoffice.netbeans.modules.office.utils.ManifestParser;
+
+public class ParcelSupport implements ParcelCookie
+{
+ private FileObject fo;
+ private ParcelZipper zipper = ParcelZipper.getParcelZipper();
+ private String language = null;
+
+ public ParcelSupport(FileObject fo) {
+ this.fo = fo;
+ }
+
+ public File getFile() {
+ return FileUtil.toFile(fo);
+ }
+
+ public String getLanguage() {
+ if (language == null) {
+ try {
+ language = zipper.getParcelLanguage(getFile());
+ }
+ catch (IOException ioe) {
+ return null;
+ }
+ }
+ return language;
+ }
+
+ public void mount()
+ {
+ File parcel = FileUtil.toFile(fo);
+
+ if (parcel != null) {
+ try {
+ ZipMounter.getZipMounter().mountZipFile(parcel);
+ }
+ catch (IOException ioe) {
+ ErrorManager.getDefault().notify(ioe);
+ }
+ catch (PropertyVetoException pve) {
+ ErrorManager.getDefault().notify(pve);
+ }
+ }
+ }
+
+ public boolean deploy(File target) {
+ File source = FileUtil.toFile(fo);
+
+ if (!target.isDirectory()) {
+ OfficeSettings settings = OfficeSettings.getDefault();
+ String message = "If you already have this document open in " +
+ "Office, please close it before continuing. Click OK to " +
+ "continue deployment.";
+
+ if (settings.getWarnBeforeDocDeploy() == true) {
+ NagDialog warning = NagDialog.createConfirmationDialog(
+ message, "Show this message in future", true);
+
+ boolean result = warning.show();
+
+ if (warning.getState() == false)
+ settings.setWarnBeforeDocDeploy(false);
+
+ if (result == false)
+ return false;
+ }
+ }
+
+ OutputWriter out =
+ getOutputWindowWriter(fo.getName() + " (deploying)");
+
+ try {
+ if (zipper.isOverwriteNeeded(source, target) == true)
+ if (promptForOverwrite(source, target) == false)
+ return false;
+ }
+ catch (IOException ioe) {
+ out.println("DEPLOYMENT FAILED: reason: " +
+ ioe.getClass().getName() + ": "+ ioe.getMessage());
+ return false;
+ }
+
+ try {
+ out.println("Deploying: " + fo.getName() +
+ "\nTo: " + target.getAbsolutePath(), null);
+
+ zipper.deployParcel(source, target);
+
+ out.println("\nDEPLOYMENT SUCCESSFUL.");
+
+ FileObject[] fileobjs = FileUtil.fromFile(target);
+ if (fileobjs != null) {
+ for (int i = 0; i < fileobjs.length; i++)
+ fileobjs[i].refresh(true);
+ }
+ }
+ catch (IOException ioe) {
+ out.println("DEPLOYMENT FAILED: reason: " +
+ ioe.getClass().getName() + ": "+ ioe.getMessage());
+ return false;
+ }
+ finally {
+ if( out != null)
+ out.close();
+ }
+ return true;
+ }
+
+ public static OutputWriter getOutputWindowWriter(String title) {
+ InputOutput io = TopManager.getDefault().getIO(title, false);
+ io.setFocusTaken(true);
+ io.setOutputVisible(true);
+
+ OutputWriter out = io.getOut();
+ try {
+ out.reset();
+ }
+ catch( IOException e) {
+ e.printStackTrace(System.err);
+ }
+ out.println(Calendar.getInstance().getTime() + ":\n");
+ return out;
+ }
+
+ private boolean promptForOverwrite(File source, File target) {
+ String message = source.getName() + " has already been deployed " +
+ "to this target. Do you wish to overwrite it?";
+
+ NotifyDescriptor d = new NotifyDescriptor.Confirmation(
+ message, NotifyDescriptor.OK_CANCEL_OPTION);
+ TopManager.getDefault().notify(d);
+
+ if (d.getValue() == NotifyDescriptor.CANCEL_OPTION)
+ return false;
+ else
+ return true;
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/filesystem/Bundle.properties b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/Bundle.properties
new file mode 100644
index 000000000000..f776ff9e7933
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/Bundle.properties
@@ -0,0 +1,44 @@
+# Filesystems API
+# {0} - root path
+# x-no-translate
+LAB_invalid_file_system=invalid OpenOffice.org document {0}
+# {0} - root path
+LAB_valid_file_system={0}
+# {0} - root path
+EXC_root_dir_does_not_exist=Root directory {0} does not exist.
+# {0} - original name before annotation
+LBL_modified_files={0} <somehow annotated>
+# {0} - file name and extension
+# {1} - display name of filesystem
+# {2} - full path to file
+EXC_file_could_not_be_locked={2} could not be locked; it did not exist or was not writable.
+# {0} - file name and extension
+# {1} - display name of filesystem
+# {2} - full path to file
+EXC_create_empty_name=Cannot create a file with an empty name.
+# {0} - file name and extension
+# {1} - display name of filesystem
+# {2} - full path to file
+EXC_folder_already_exists=Folder {2} already exists.
+# {0} - file name and extension
+# {1} - display name of filesystem
+# {2} - full path to file
+EXC_folder_could_not_be_created=Folder {2} could not be created.
+# {0} - file name and extension
+# {1} - display name of filesystem
+# {2} - full path to file
+EXC_file_could_not_be_created=File {2} could not be created.
+# {0} - old file name and extension
+# {1} - new file name and extension
+# {2} - display name of filesystem
+# {3} - full path to old file
+# {4} - full path to new file
+EXC_file_could_not_be_renamed=File {3} could not be renamed to {4}.
+# {0} - file name and extension
+# {1} - display name of filesystem
+# {2} - full path to file
+EXC_file_could_not_be_deleted=File {2} could not be deleted.
+PROP_readOnly=Read Only
+HINT_readOnly=Whether this filesystem should be writable, or read-only.
+PROP_document=OpenOffice.org Document
+HINT_document=OpenOffice.org Document (mount point) of this filesystem.
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/filesystem/Bundle_en_US.properties b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/Bundle_en_US.properties
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/Bundle_en_US.properties
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/filesystem/OpenOfficeDocFileSystem.java b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/OpenOfficeDocFileSystem.java
new file mode 100644
index 000000000000..795da90df74f
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/OpenOfficeDocFileSystem.java
@@ -0,0 +1,1192 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.filesystem;
+
+import java.beans.*;
+import java.io.*;
+import java.util.*;
+import java.util.zip.*;
+
+import org.openide.ErrorManager;
+import org.openide.filesystems.*;
+import org.openide.filesystems.FileSystem; // override java.io.FileSystem
+import org.openide.util.NbBundle;
+
+// ISSUES:
+// - This FS saves (updates) the file on 'setDocument' or 'removeNotify'.
+// It has to let the user to decide to update or not.
+//
+// TODOS:
+// - 'Update' action on the mounted document which saves all recent modifications.
+// - To introduce 'scope' editable property to control editable portion of
+// the mounted document.
+// - Acceptable document type identification before mount.
+
+/**
+ * OpenOffice.org Document filesystem.
+ *
+ * @author misha <misha@openoffice.org>
+ */
+public class OpenOfficeDocFileSystem
+ extends AbstractFileSystem
+{
+ public static final String SCRIPTS_ROOT = "Scripts"; // must be a folder
+ public static final String SEPARATOR = "/"; // zip file separator
+
+ private static final int OS_UNKNOWN = 0;
+ private static final int OS_UNIX = 1;
+ private static final int OS_MACOS = 2;
+ private static final int OS_WINDOWS = 3;
+
+ private static final int REFRESH_OFF = -1; // -1 is desabled
+ private static final int REFRESH_TIME = REFRESH_OFF; // (mS)
+ private static final String TMP_FILE_PREF = "sx_";
+ private static final String TMP_FILE_SUFX = ".sxx";
+
+ private transient Map cache; // filesystem cache
+ private transient File docFile; // OpenOffice document
+ private transient ZipFile zipFile;
+
+ private static transient int osType; // type of OS
+
+ private transient ChildrenStrategy childrenStrategy;
+ private transient EditableStrategy editableStrategy;
+
+ private transient boolean isModified; // true if an entry has been removed
+
+ /**
+ * Static constructor.
+ */
+ static {
+ // Identify the type of OS
+ String osname = System.getProperty("os.name");
+ if (osname.startsWith("Mac OS"))
+ osType = OS_MACOS;
+ else if (osname.startsWith("Windows"))
+ osType = OS_WINDOWS;
+ else
+ osType = OS_UNIX;
+ }
+
+ /**
+ * Default constructor. Initializes new OpenOffice filesystem.
+ */
+ public OpenOfficeDocFileSystem()
+ {
+ // Create the filesystem cache
+ cache = new HashMap();
+
+ // Initialize strategies
+ editableStrategy = new EditableStrategy(SCRIPTS_ROOT);
+ childrenStrategy = new ChildrenStrategy();
+
+ // Create and use implementations of filesystem functionality:
+ info = new InfoImpl();
+ change = new ChangeImpl();
+
+ // Handle filesystem.attributes files normally:
+ DefaultAttributes defattr = new DefaultAttributes(
+ info, change, new ListImpl());
+
+ // Handle filesystem.attributes files normally + adds virtual attribute
+ // "java.io.File" that is used in conversion routines FileUtil.toFile and
+ // FileUtil.fromFile
+ //defattr = new InnerAttrs(this, info, change, new ListImpl());
+ // (Otherwise set attr to a special implementation, and use ListImpl for list.)
+ attr = defattr;
+ list = defattr;
+
+ // transfer = new TransferImpl();
+ setRefreshTime(REFRESH_OFF);
+ }
+
+ /**
+ * Constructor. Initializes new OpenOffice filesystem with FS capability.
+ */
+ public OpenOfficeDocFileSystem(FileSystemCapability cap)
+ {
+ this();
+ setCapability(cap);
+ }
+
+ /**
+ * Provides unique signature of an instance of the filesystem.
+ * NOTE: The scope is not a part of the signature so it is impossible
+ * to mount the same archive more then once.
+ */
+ public static String computeSystemName(File file)
+ {
+ return OpenOfficeDocFileSystem.class.getName() + "[" + file + "]";
+ }
+
+ // ----------- PROPERTIES --------------
+
+ /**
+ * Provides the 'human readable' name of the instance of the filesystem.
+ */
+ public String getDisplayName()
+ {
+ if (!isValid())
+ return NbBundle.getMessage(OpenOfficeDocFileSystem.class,
+ "LAB_invalid_file_system", ((docFile != null)? docFile.toString(): ""));
+ else
+ return NbBundle.getMessage(OpenOfficeDocFileSystem.class,
+ "LAB_valid_file_system", docFile.toString());
+ }
+
+ /**
+ * Retrives the 'document' property.
+ */
+ public File getDocument()
+ {
+ return docFile;
+ }
+
+ /**
+ * Sets the 'document' property.
+ */
+ // Bean setter. Changing the OpenOffice document (or in general, the identity
+ // of the root file object) should cause everything using this filesystem
+ // to refresh. The system name must change and refreshRoot should be used
+ // to ensure that everything is correctly updated.
+ public synchronized void setDocument(File file)
+ throws java.beans.PropertyVetoException, java.io.IOException
+ {
+System.out.println("OpenOfficeDocFileSystem.setDocument: file=\"" + file.toString() + "\"");
+ if((file.exists() == false) || (file.isFile() == false)) {
+ IOException ioe = new IOException(
+ file.toString() + " does not exist");
+ ErrorManager.getDefault().annotate(ioe, NbBundle.getMessage(
+ OpenOfficeDocFileSystem.class, "EXC_root_dir_does_not_exist",
+ file.toString()));
+ throw ioe;
+ }
+ // update the document
+ try {
+ updateDocument();
+ } catch(IOException ioe) {
+ // cannot save all!!!
+System.out.println("*** OpenOfficeDocFileSystem.setDocument:");
+System.out.println(" file: " + ((docFile != null)? docFile.toString(): ""));
+System.out.println(" exception: " + ioe.getMessage());
+ }
+ // new document type verification!!!
+ closeDocument();
+ // open a new document
+ try {
+ openDocument(file);
+ firePropertyChange(PROP_ROOT, null, refreshRoot());
+ setRefreshTime(REFRESH_TIME);
+ } catch(IOException ioe) {
+ // cannot open a new document!!!
+System.out.println("*** OpenOfficeDocFileSystem.setDocument:");
+System.out.println(" file: " + ((file != null)? file.toString(): ""));
+System.out.println(" exception: " + ioe.getMessage());
+ }
+ }
+
+ /**
+ * Retrives 'readonly' property.
+ * NOTE: The portion of the mounted document available to the user is
+ * always editable.
+ */
+ public boolean isReadOnly()
+ {
+ return false;
+ }
+
+ /**
+ * Sets 'readonly' property.
+ * NOTE: The portion of the mounted document available to the user is
+ * always editable.
+ */
+ public void setReadOnly(boolean flag)
+ {
+ // sorry! it is not supported.
+ }
+
+ // ----------- SPECIAL CAPABILITIES --------------
+
+ /**
+ * Participates in the environment configuration.
+ * This is how you can affect the classpath for execution, compilation, etc.
+ */
+ public void prepareEnvironment(FileSystem.Environment environment)
+ {
+ // BUG: the compiller cannot access files withing the OpenOffice document.
+ //environment.addClassPath(docFile.toString());
+ }
+
+ /* -----------------------------------------------------------
+ * Affect the name and icon of files on this filesystem according to their
+ * "status", e.g. version-control modification-commit state:
+ /*
+ private class StatusImpl implements Status {
+ public Image annotateIcon(Image icon, int iconType, Set files) {
+ // You may first modify it, e.g. by adding a check mark to the icon
+ // if that makes sense for this file or group of files.
+ return icon;
+ }
+ public String annotateName(String name, Set files) {
+ // E.g. add some sort of suffix to the name if some of the
+ // files are modified but not backed up or committed somehow:
+ if (theseFilesAreModified(files))
+ return NbBundle.getMessage(OpenOfficeDocFileSystem.class, "LBL_modified_files", name);
+ else
+ return name;
+ }
+ }
+
+ private transient Status status;
+
+ public Status getStatus() {
+ if (status == null) {
+ status = new StatusImpl();
+ }
+ return status;
+ }
+ // And use fireFileStatusChanged whenever you know something has changed.
+ */
+
+ /*
+ // Filesystem-specific actions, such as version-control operations.
+ // The actions should typically be CookieActions looking for DataObject
+ // cookies, where the object's primary file is on this type of filesystem.
+ public SystemAction[] getActions() {
+// ------>>>> UPDATE OPENOFFICE DOCUMENT <<<<------
+ return new SystemAction[] {
+ SystemAction.get(SomeAction.class),
+ null, // separator
+ SystemAction.get(SomeOtherAction.class)
+ };
+ }
+ */
+
+ /**
+ * Notifies this filesystem that it has been removed from the repository.
+ * Concrete filesystem implementations could perform clean-up here.
+ * The default implementation does nothing.
+ * <p>Note that this method is <em>advisory</em> and serves as an optimization
+ * to avoid retaining resources for too long etc. Filesystems should maintain correct
+ * semantics regardless of whether and when this method is called.
+ */
+ public void removeNotify()
+ {
+ setRefreshTime(REFRESH_OFF); // disable refresh
+ // update the document
+ try {
+ updateDocument();
+ } catch(IOException ioe) {
+ // cannot save all!!!
+System.out.println("*** OpenOfficeDocFileSystem.removeNotify:");
+System.out.println(" exception: " + ioe.getMessage());
+ }
+ closeDocument();
+ super.removeNotify();
+ }
+
+ /*
+ * Opens (mounts) an OpenOffice document.
+ */
+ private void openDocument(File file)
+ throws IOException, PropertyVetoException
+ {
+ synchronized(cache) {
+ setSystemName(computeSystemName(file));
+ docFile = file;
+ zipFile = new ZipFile(docFile);
+ cacheDocument(zipFile.entries(), editableStrategy);
+ isModified = false;
+ } // synchronized
+ }
+
+ /*
+ * Closes the document and cleans up the cache.
+ */
+ private void closeDocument()
+ {
+ synchronized(cache) {
+ // if a document mounted - close it
+ if(docFile != null) {
+ // close the document archive
+ if(zipFile != null) {
+ try {
+ zipFile.close();
+ } catch(IOException ioe) {
+ // sorry! we can do nothing about it.
+ }
+ }
+ zipFile = null;
+ // clean up cache
+ scanDocument(new CleanStrategy());
+ docFile = null;
+ isModified = false;
+ }
+ } // synchronized
+ }
+
+ /*
+ * Creates a document cache.
+ */
+ private void cacheDocument(Enumeration entries, Strategy editables)
+ {
+ Entry cacheEntry;
+ ZipEntry archEntry;
+ synchronized(cache) {
+ cache.clear();
+ // root folder
+ cacheEntry = new ReadWriteEntry(null);
+ cache.put(cacheEntry.getName(), cacheEntry);
+ // the rest of items
+ while(entries.hasMoreElements()) {
+ archEntry = (ZipEntry)entries.nextElement();
+ cacheEntry = new Entry(archEntry);
+ if(editables.evaluate(cacheEntry))
+ cacheEntry = new ReadWriteEntry(archEntry);
+ cache.put(cacheEntry.getName(), cacheEntry);
+ }
+ } // synchronized
+ }
+
+ /*
+ * Updates the document.
+ */
+ private void updateDocument()
+ throws IOException
+ {
+ if(docFile == null)
+ return;
+ synchronized(cache) {
+ ModifiedStrategy modifiedStrategy = new ModifiedStrategy();
+ scanDocument(modifiedStrategy);
+ if((isModified == true) ||
+ (modifiedStrategy.isModified() == true))
+ {
+ File tmpFile = null;
+ try {
+ // create updated document
+ tmpFile = File.createTempFile(
+ TMP_FILE_PREF, TMP_FILE_SUFX, docFile.getParentFile());
+ saveDocument(tmpFile);
+ } catch(IOException ioe) {
+ if(tmpFile != null)
+ tmpFile.delete();
+ throw ioe;
+ }
+ // close the document archive
+ if(zipFile != null) {
+ try {
+ zipFile.close();
+ } catch(IOException ioe) {
+ }
+ }
+ zipFile = null;
+ // create the document and backup
+ File newFile = new File(docFile.getParentFile() + File.separator +
+ "~" + docFile.getName());
+ if(newFile.exists())
+ newFile.delete(); // delete old backup
+ docFile.renameTo(newFile);
+ tmpFile.renameTo(docFile);
+ // open the document archive
+ zipFile = new ZipFile(docFile);
+ }
+ isModified = false;
+ } // synchronized
+ }
+
+ /*
+ * Saves the document in a new archive.
+ */
+ private void saveDocument(File file)
+ throws IOException
+ {
+ synchronized(cache) {
+ SaveStrategy saver = new SaveStrategy(file);
+ scanDocument(saver);
+ saver.close();
+ } // synchronized
+ }
+
+ /*
+ * Provides each individual entry in the cached document to an apraiser.
+ */
+ private void scanDocument(Strategy strategy)
+ {
+ synchronized(cache) {
+ Iterator itr = cache.values().iterator();
+ while(itr.hasNext()) {
+ strategy.evaluate((Entry)itr.next());
+ }
+ } // synchronized
+ }
+
+ /*
+ * Retrives or creates a file.
+ */
+ private Entry getFileEntry(String name)
+ throws IOException
+ {
+ Entry cEntry = null;
+ synchronized(cache) {
+ cEntry = (Entry)cache.get(name);
+ if(cEntry == null) {
+ // create a new file
+ ZipEntry zEntry = new ZipEntry(name);
+ zEntry.setTime(new Date().getTime());
+ cEntry = new Entry(zEntry);
+ if(editableStrategy.evaluate(cEntry) == false) {
+ throw new IOException(
+ "cannot create/edit readonly file"); // I18N
+ }
+ cEntry = new ReadWriteEntry(zEntry);
+ cache.put(cEntry.getName(), cEntry);
+ isModified = true;
+ }
+ } // synchronized
+ return cEntry;
+ }
+
+ /*
+ * Retrives or creates a folder.
+ */
+ private Entry getFolderEntry(String name)
+ throws IOException
+ {
+ Entry cEntry = null;
+ synchronized(cache) {
+ cEntry = (Entry)cache.get(name);
+ if(cEntry == null) {
+ // create a new folder
+ ZipEntry zEntry = new ZipEntry(name + SEPARATOR);
+ zEntry.setMethod(ZipEntry.STORED);
+ zEntry.setSize(0);
+ CRC32 crc = new CRC32();
+ zEntry.setCrc(crc.getValue());
+ zEntry.setTime(new Date().getTime());
+ cEntry = new Entry(zEntry);
+ if(editableStrategy.evaluate(cEntry) == false) {
+ throw new IOException(
+ "cannot create folder"); // I18N
+ }
+ cEntry = new ReadWriteEntry(zEntry);
+ cEntry.getOutputStream(); // sets up modified flag
+ cache.put(cEntry.getName(), cEntry);
+ isModified = true;
+ } else {
+ if(cEntry.isFolder() == false)
+ cEntry = null;
+ }
+ } // synchronized
+ return cEntry;
+ }
+
+ /*
+ * Converts the name to ZIP file name.
+ * Removes the leading file separator if there is one.
+ * This is WORKAROUND of the BUG in AbstractFileObject:
+ * While AbstractFileObject reprecents the root of the filesystem it uses
+ * the absolute path (the path starts with '/'). It is inconsistent with
+ * the rest of the code.
+ * WORKAROUND: we have to strip leading '/' if it is in the name.
+ */
+ private static String zipName(String name)
+ {
+ String zname = ((name.startsWith(File.separator))?
+ name.substring(File.separator.length()): name);
+ switch(osType) {
+ case OS_MACOS:
+ zname = zname.replace(':', '/'); // ':' by '/'
+ break;
+ case OS_WINDOWS:
+ zname = zname.replace((char)0x5c, '/'); // '\' by '/'
+ break;
+ default:
+ break;
+ }
+ return zname;
+ }
+
+ // ----------- IMPLEMENTATIONS OF ABSTRACT FUNCTIONALITY ----------
+
+ /* -----------------------------------------------------------
+ * Information about files and operations on the contents which do
+ * not affect the file's presence or name.
+ */
+ private class InfoImpl
+ implements Info
+ {
+ public boolean folder(String name) {
+ synchronized(cache) {
+ String zname = zipName(name);
+ Entry entry = (Entry)cache.get(zname);
+ if(entry != null)
+ return entry.isFolder();
+ // logical zip file entry
+ childrenStrategy.setParent(zname);
+ scanDocument(childrenStrategy);
+ return (childrenStrategy.countChildren() > 0);
+ }
+ }
+
+ public Date lastModified(String name) {
+ synchronized(cache) {
+ Entry entry = (Entry)cache.get(zipName(name));
+ return new Date((entry != null)? entry.getTime(): 0L);
+ }
+ }
+
+ public boolean readOnly(String name) {
+ synchronized(cache) {
+ Entry entry = (Entry)cache.get(zipName(name));
+ return (entry != null)? entry.isReadOnly(): false;
+ }
+ }
+
+ public String mimeType(String name) {
+ // Unless you have some special means of determining MIME type
+ // (e.g. HTTP headers), ask IDE to use its normal heuristics:
+ // the MIME resolver pool and then file extensions, or if nothing
+ // matches, just content/unknown.
+ return null;
+ }
+
+ public long size(String name) {
+ synchronized(cache) {
+ Entry entry = (Entry)cache.get(zipName(name));
+ return (entry != null)? entry.getSize(): 0;
+ } // synchronized
+ }
+
+ public InputStream inputStream(String name)
+ throws FileNotFoundException
+ {
+ synchronized(cache) {
+ Entry entry = (Entry)cache.get(zipName(name));
+ return (entry != null)? entry.getInputStream(): null;
+ } // synchronized
+ }
+
+ public OutputStream outputStream(String name)
+ throws IOException
+ {
+ return getFileEntry(zipName(name)).getOutputStream();
+ }
+
+ // AbstractFileSystem handles locking the file to the rest of the IDE.
+ // This only means that you should define how the file should be locked
+ // to the outside world--perhaps it does not need to be.
+ public void lock(String name)
+ throws IOException
+ {
+/*
+ File file = getFile(name);
+ if (file.exists() == true && file.canWrite() == false) {
+ IOException ioe = new IOException("file " + file +
+ " could not be locked");
+ ErrorManager.getDefault().annotate(ioe, NbBundle.getMessage(
+ OpenOfficeDocFileSystem.class, "EXC_file_could_not_be_locked",
+ file.getName(), getDisplayName(), file.getPath()));
+ throw ioe;
+ }
+*/
+ }
+
+ public void unlock(String name) {
+ // Nothing special needed to unlock a file to the outside world.
+ }
+
+ public void markUnimportant(String name) {
+ // Do nothing special. Version-control systems may use this to mark
+ // certain files (e.g. *.class) as not needing to be stored in the VCS
+ // while others (source files) are by default important.
+ }
+
+ }
+
+ /* -----------------------------------------------------------
+ * Operations that change the available files.
+ */
+ private class ChangeImpl
+ implements Change
+ {
+ public void createFolder(String name)
+ throws IOException
+ {
+ synchronized(cache) {
+ String zname = zipName(name);
+ if(cache.get(zname) != null) {
+ throw new IOException(
+ "cannot create new folder: " + name); // I18N
+ }
+ getFolderEntry(zname);
+ } // synchronized
+ }
+
+ public void createData(String name)
+ throws IOException
+ {
+ synchronized(cache) {
+ String zname = zipName(name);
+ if(cache.get(zname) != null) {
+ throw new IOException(
+ "cannot create new data: " + name); // I18N
+ }
+ OutputStream os = getFileEntry(zname).getOutputStream();
+ os.close();
+ } // synchronized
+ }
+
+ public void rename(String oldName, String newName)
+ throws IOException
+ {
+ String oname = zipName(oldName);
+ String nname = zipName(newName);
+ if((oname.length() == 0) || (nname.length() == 0)) {
+ throw new IOException(
+ "cannot move or rename the root folder"); // I18N
+ }
+ synchronized(cache) {
+ if(cache.get(nname) != null) {
+ throw new IOException(
+ "target file/folder " + newName + " exists"); // I18N
+ }
+ Entry entry = (Entry)cache.get(oname);
+ if(entry == null) {
+ throw new IOException(
+ "there is no such a file/folder " + oldName); // I18N
+ }
+ if(entry.isReadOnly() == true) {
+ throw new IOException(
+ "file/folder " + oldName + " is readonly"); // I18N
+ }
+ entry.rename(nname);
+ if(editableStrategy.evaluate(entry) == false) {
+ entry.rename(oname);
+ throw new IOException(
+ "cannot create file/folder"); // I18N
+ }
+ cache.remove(oname);
+ cache.put(entry.getName(), entry);
+ } // synchronized
+ }
+
+ public void delete(String name)
+ throws IOException
+ {
+ String zname = zipName(name);
+ if(zname.length() == 0) {
+ throw new IOException(
+ "cannot delete the root folder"); // I18N
+ }
+ synchronized(cache) {
+ Entry entry = (Entry)cache.remove(zname);
+ if(entry != null) {
+ // BUG: this is the design bug. Cache has to
+ // remember that the entry was removed.
+ isModified = true;
+ entry.clean();
+ }
+ } // synchronized
+ }
+ }
+
+ /* -----------------------------------------------------------
+ * Operation which provides the directory structure.
+ */
+ private class ListImpl
+ implements List
+ {
+ public String[] children(String name)
+ {
+ String[] children = null;
+ synchronized(cache) {
+ String zname = zipName(name);
+ Entry entry = (Entry)cache.get(zname);
+ if(entry != null) {
+ // real zip file entry
+ if(entry.isFolder()) {
+ childrenStrategy.setParent(entry.getName());
+ }
+ } else {
+ // logical zip file entry
+ // (portion of the path of a real zip file entry)
+ childrenStrategy.setParent(zname);
+ }
+ scanDocument(childrenStrategy);
+ children = childrenStrategy.getChildren();
+ } // synchronize
+ return children;
+ }
+
+ }
+
+ /** -----------------------------------------------------------
+ * This class adds new virtual attribute "java.io.File".
+ * Because of the fact that FileObjects of __Sample__FileSystem are convertible
+ * to java.io.File by means of attributes. */
+ /*private static class InnerAttrs extends DefaultAttributes {
+ //static final long serialVersionUID = 1257351369229921993L;
+ __Sample__FileSystem sfs;
+ public InnerAttrs(__Sample__FileSystem sfs, AbstractFileSystem.Info info,
+ AbstractFileSystem.Change change,AbstractFileSystem.List list ) {
+ super(info, change, list);
+ this.sfs = sfs;
+ }
+ public Object readAttribute(String name, String attrName) {
+ if (attrName.equals("java.io.File")) // NOI18N
+ return sfs.getFile(name);
+
+ return super.readAttribute(name, attrName);
+ }
+ }*/
+
+ /* -----------------------------------------------------------
+ // Optional special implementations of copy and (cross-directory) move.
+ private class TransferImpl implements Transfer {
+
+ public boolean copy(String name, Transfer target, String targetName) throws IOException {
+ // Only permit special implementation within single FS
+ // (or you could implement it across filesystems if you wished):
+ if (target != this) return false;
+ // Specially copy the file in an efficient way, e.g. implement
+ // a copy-on-write algorithm.
+ return true;
+ }
+
+ public boolean move(String name, Transfer target, String targetName) throws IOException {
+ // Only permit special implementation within single FS
+ // (or you could implement it across filesystems if you wished):
+ if (target != this) return false;
+ // Specially move the file, e.g. retain rename information even
+ // across directories in a version-control system.
+ return true;
+ }
+
+ }
+ */
+
+ /* -----------------------------------------------------------
+ * This interface hides an action will be performed on an entry.
+ */
+ private interface Strategy
+ {
+ public boolean evaluate(Entry entry);
+ }
+
+ /* -----------------------------------------------------------
+ * Recognizes editable (read-write) entires
+ */
+ private class EditableStrategy
+ implements Strategy
+ {
+ private String scope;
+
+ public EditableStrategy(String scope)
+ {
+ this.scope = scope;
+ }
+
+ public boolean evaluate(Entry entry)
+ {
+ // recognizes all entries in a subtree of the
+ // 'scope' as editable entries
+ return (entry != null)?
+ entry.getName().startsWith(scope): false;
+ }
+ }
+
+ /* -----------------------------------------------------------
+ * Recognizes and accumulates immediate children of the parent.
+ */
+ private class ChildrenStrategy
+ implements Strategy
+ {
+ private String parent;
+ private Collection children = new HashSet();
+
+ public ChildrenStrategy()
+ {
+ }
+
+ public void setParent(String name)
+ {
+ parent = (name.length() > 0)? (name + SEPARATOR): "";
+ if(children == null)
+ children = (java.util.List)new LinkedList();
+ children.clear();
+ }
+
+ public boolean evaluate(Entry entry)
+ {
+ // do not accept "children" of a file
+ // ignore "read only" part of the filesystem
+ if(entry.isReadOnly() == false) {
+ // identify a child
+ if( (entry.getName().length() > 0) &&
+ (entry.getName().startsWith(parent)))
+ {
+ // identify an immediate child
+ String child = entry.getName();
+ if(parent.length() > 0) {
+ child = entry.getName().substring(parent.length());
+ }
+ int idx = child.indexOf(SEPARATOR);
+ if(idx > 0) // more path elements ahead
+ child = child.substring(0, idx);
+ return children.add(child);
+ }
+ }
+ return false;
+ }
+
+ public int countChildren()
+ {
+ return children.size();
+ }
+
+ public String[] getChildren()
+ {
+ String[] chn = new String[children.size()];
+ Iterator itr = children.iterator();
+ int idx = 0;
+ while(itr.hasNext()) {
+ chn[idx++] = (String)itr.next();
+ }
+ return chn;
+ }
+ }
+
+ /* -----------------------------------------------------------
+ * Recognizes cache entries which have to be save into new archive.
+ */
+ private class ModifiedStrategy
+ implements Strategy
+ {
+ private boolean modified;
+
+ public boolean evaluate(Entry entry)
+ {
+ modified |= entry.isModified();
+ return entry.isModified();
+ }
+
+ public boolean isModified()
+ {
+ return modified;
+ }
+ }
+
+ /* -----------------------------------------------------------
+ * Saves each entry in the filesystem cache.
+ */
+ private class SaveStrategy
+ implements Strategy
+ {
+ ZipOutputStream docos;
+ IOException ioexp;
+
+ public SaveStrategy(File newdoc)
+ throws IOException
+ {
+ docos = new ZipOutputStream(new FileOutputStream(newdoc));
+ ioexp = null; // success by default
+ }
+
+ public boolean evaluate(Entry entry)
+ {
+ if(entry.getName().length() == 0)
+ return false;
+ try {
+ entry.save(docos);
+ } catch(IOException ioe) {
+ if(ioexp == null)
+ ioexp = ioe;
+ }
+ return true;
+ }
+
+ public void close()
+ throws IOException
+ {
+ if(docos != null) {
+ try {
+ docos.close();
+ } catch (IOException ioe) {
+ ioexp = ioe;
+ } finally {
+ docos = null;
+ }
+ if(ioexp != null) {
+ throw ioexp;
+ }
+ }
+ }
+ }
+
+ /* -----------------------------------------------------------
+ * Cleans each entiry in the filesystem cache.
+ */
+ private class CleanStrategy
+ implements Strategy
+ {
+ public boolean evaluate(Entry entry)
+ {
+ try {
+ entry.clean();
+ } catch(java.lang.Exception exp) {
+ // sorry! can do nothing about it.
+ }
+ return true;
+ }
+ }
+
+ /* -----------------------------------------------------------
+ * ReadOnly cache entry
+ */
+ private class Entry
+ {
+ private String name;
+ private boolean folder;
+ private long size;
+ private long time;
+ private File node; // data files only
+
+ public Entry(ZipEntry entry)
+ {
+ if(entry != null) {
+ name = entry.getName();
+ folder = entry.isDirectory();
+ size = entry.getSize();
+ time = entry.getTime();
+ // removes tail file separator from a folder name
+ if((folder == true) && (name.endsWith(SEPARATOR))) {
+ name = name.substring(
+ 0, name.length() - SEPARATOR.length());
+ }
+ } else {
+ // 'null' is special cace of root folder
+ name = "";
+ folder = true;
+ size = 0;
+ time = -1;
+ }
+ }
+
+ public boolean isReadOnly()
+ {
+ return true;
+ }
+
+ public boolean isFolder()
+ {
+ return folder;
+ }
+
+ public boolean isModified()
+ {
+ return false;
+ }
+
+ public String getName()
+ {
+ return name;
+ }
+
+ public long getSize()
+ {
+ return size;
+ }
+
+ public long getTime()
+ {
+ // ajust last modified time to the java.io.File
+ return (time >= 0)? time: 0;
+ }
+
+ public InputStream getInputStream()
+ throws FileNotFoundException
+ {
+ return (isFolder() == false)? new FileInputStream(getFile()): null;
+ }
+
+ public OutputStream getOutputStream()
+ throws IOException
+ {
+ return null;
+ }
+
+ public void rename(String name)
+ throws IOException
+ {
+// throw new IOException(
+// "cannot rename readonly file: " + getName()); // I18N
+ // BUG: this is the design bug. Cache has to mamage such kind
+ // of operation in order to keep the data integrity.
+ this.name = name;
+ }
+
+ public void save(ZipOutputStream arch)
+ throws IOException
+ {
+ InputStream is = null;
+ ZipEntry entry = new ZipEntry(
+ getName() + ((isFolder())? SEPARATOR: ""));
+ try {
+ if(isFolder()) {
+ // folder
+ entry.setMethod(ZipEntry.STORED);
+ entry.setSize(0);
+ CRC32 crc = new CRC32();
+ entry.setCrc(crc.getValue());
+ entry.setTime(getTime());
+ arch.putNextEntry(entry);
+ } else {
+ // file
+ if(isModified() == false)
+ entry.setTime(getTime());
+ else
+ entry.setTime(node.lastModified());
+ arch.putNextEntry(entry);
+ is = getInputStream();
+ FileUtil.copy(is, arch);
+ }
+ } finally {
+ // close streams
+ if(is != null) {
+ try {
+ is.close();
+ } catch(java.io.IOException ioe) {
+ // sorry! can do nothing about it.
+ }
+ }
+ if(arch != null)
+ arch.closeEntry();
+ }
+ }
+
+ public void clean()
+ throws IOException
+ {
+ if(node != null)
+ node.delete();
+ }
+
+ public String toString()
+ {
+ return (
+ ((isReadOnly())? "RO ": "RW ") +
+ ((isFolder())? "D": "F") +
+ " \"" + getName() + "\"");
+ }
+
+ /* package */ File getFile()
+ throws FileNotFoundException
+ {
+ if(node == null) {
+ try {
+ node = File.createTempFile(TMP_FILE_PREF, TMP_FILE_SUFX);
+ // copy the file from archive to the cache
+ OutputStream nos = null;
+ InputStream zis = null;
+ try {
+ ZipEntry entry = zipFile.getEntry(getName());
+ if(entry != null) {
+ // copy existing file to the cache
+ zis = zipFile.getInputStream(entry);
+ nos = new FileOutputStream(node);
+ FileUtil.copy(zis, nos);
+ }
+ } finally {
+ // close streams
+ if(nos != null) {
+ try {
+ nos.close();
+ } catch(java.io.IOException ioe) {
+ }
+ }
+ if(zis != null) {
+ try {
+ zis.close();
+ } catch(java.io.IOException ioe) {
+ }
+ }
+ }
+ } catch(java.lang.Exception exp) {
+ // delete cache file
+ if(node != null)
+ node.delete();
+ node = null;
+ throw new FileNotFoundException(
+ "cannot access file: " + getName()); // I18N
+ }
+ }
+ return node;
+ }
+
+ }
+
+ /* -----------------------------------------------------------
+ * ReadWrite cache entry
+ */
+ private class ReadWriteEntry
+ extends Entry
+ {
+ private boolean modified;
+
+ // 'null' is special cace of root folder
+ public ReadWriteEntry(ZipEntry entry)
+ {
+ super(entry);
+ }
+
+ public boolean isReadOnly()
+ {
+ return false;
+ }
+
+ public boolean isModified()
+ {
+ return modified;
+ }
+
+ public void rename(String name)
+ throws IOException
+ {
+ modified = true;
+ super.rename(name);
+ }
+
+ public OutputStream getOutputStream()
+ throws IOException
+ {
+ modified = true;
+ return (isFolder() == false)? new FileOutputStream(getFile()): null;
+ }
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/filesystem/OpenOfficeDocFileSystemBeanInfo.java b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/OpenOfficeDocFileSystemBeanInfo.java
new file mode 100644
index 000000000000..c282a2fa2ad7
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/OpenOfficeDocFileSystemBeanInfo.java
@@ -0,0 +1,125 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.filesystem;
+
+import java.awt.Image;
+import java.io.File;
+import java.beans.*;
+
+import org.openide.ErrorManager;
+import org.openide.filesystems.FileSystem;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/**
+ * Description of the OpenOffice.org Document filesystem.
+ *
+ * @author misha <misha@openoffice.org>
+ */
+public class OpenOfficeDocFileSystemBeanInfo
+ extends SimpleBeanInfo
+{
+ private static String ICONLOCATION =
+ "org/openoffice/netbeans/modules/office/resources";
+ private static String COLORICON16NAME =
+ ICONLOCATION + File.separator + "OpenOfficeDocFileSystemIcon.png";
+ private static String COLORICON32NAME =
+ ICONLOCATION + File.separator + "OpenOfficeDocFileSystemIcon32.png";
+
+ /**
+ * Retrives an additional bean information.
+ */
+ public BeanInfo[] getAdditionalBeanInfo()
+ {
+ try {
+ return new BeanInfo[] {
+ Introspector.getBeanInfo(FileSystem.class)
+ };
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+/*
+ // If you have a visual dialog to customize configuration of the
+ // filesystem:
+ public BeanDescriptor getBeanDescriptor()
+ {
+ return new BeanDescriptor(OpenOfficeDocFileSystem.class,
+ OpenOfficeDocFileSystemCustomizer.class);
+ }
+*/
+ /**
+ * Retrives bean property descriptors.
+ */
+ public PropertyDescriptor[] getPropertyDescriptors()
+ {
+ try {
+ // Included only to make it a writable property (it is read-only
+ // in FileSystem):
+ PropertyDescriptor readOnly = new PropertyDescriptor(
+ "readOnly", OpenOfficeDocFileSystem.class);
+ readOnly.setDisplayName(NbBundle.getMessage(
+ OpenOfficeDocFileSystemBeanInfo.class, "PROP_readOnly"));
+ readOnly.setShortDescription(NbBundle.getMessage(
+ OpenOfficeDocFileSystemBeanInfo.class, "HINT_readOnly"));
+
+ // This could be whatever properties you use to configure the
+ // filesystem:
+ PropertyDescriptor document = new PropertyDescriptor(
+ "Document", OpenOfficeDocFileSystem.class);
+ document.setDisplayName(NbBundle.getMessage(
+ OpenOfficeDocFileSystemBeanInfo.class, "PROP_document"));
+ document.setShortDescription(NbBundle.getMessage(
+ OpenOfficeDocFileSystemBeanInfo.class, "HINT_document"));
+ // Request to the property editor that it be permitted only to
+ // choose directories:
+ document.setValue("directories", Boolean.FALSE); // NOI18N
+ document.setValue("files", Boolean.TRUE); // NOI18N
+
+ return new PropertyDescriptor[] {readOnly, document};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+
+ /**
+ * Retrives an icon by the icon type.
+ */
+ public Image getIcon(int type)
+ {
+ if((type == BeanInfo.ICON_COLOR_16x16) ||
+ (type == BeanInfo.ICON_MONO_16x16)) {
+ return Utilities.loadImage(COLORICON16NAME);
+ } else {
+ return Utilities.loadImage(COLORICON32NAME);
+ }
+ }
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/Bundle.properties b/scripting/java/org/openoffice/netbeans/modules/office/loader/Bundle.properties
new file mode 100644
index 000000000000..eab2fa1f3fbc
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/Bundle.properties
@@ -0,0 +1,13 @@
+# Datasystems API
+#PROP_myProp=<name of my property>
+#HINT_myProp=<description of my property>
+#LBL_DataNode_exec_sheet=Execution
+#HINT_DataNode_exec_sheet=Properties pertaining to compiling, running, and debugging.
+# x-no-translate
+LBL_loaderName=<display name of the data loader>
+# Datasystems API
+#PROP_myProp=<name of my property>
+#HINT_myProp=<description of my property>
+#LBL_DataNode_exec_sheet=Execution
+#HINT_DataNode_exec_sheet=Properties pertaining to compiling, running, and debugging.
+LBL_loaderName=<display name of the data loader>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataLoader.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataLoader.java
new file mode 100644
index 000000000000..27aae5ccce4a
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataLoader.java
@@ -0,0 +1,112 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.io.IOException;
+import java.io.File;
+
+import org.openide.actions.*;
+import org.openide.filesystems.*;
+import org.openide.loaders.*;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.SystemAction;
+
+import org.openoffice.netbeans.modules.office.actions.MountDocumentAction;
+
+/** Recognizes single files in the Repository as being of a certain type.
+ *
+ * @author tomaso
+ */
+public class OfficeDocumentDataLoader extends UniFileLoader {
+
+ public OfficeDocumentDataLoader() {
+ this("org.openoffice.netbeans.modules.office.loader.OfficeDocumentDataObject");
+ }
+
+ // Can be useful for subclasses:
+ protected OfficeDocumentDataLoader(String recognizedObjectClass) {
+ super(recognizedObjectClass);
+ }
+
+ protected String defaultDisplayName() {
+ return "Office Document";
+ }
+
+ protected void initialize() {
+ super.initialize();
+
+ ExtensionList extensions = new ExtensionList();
+ extensions.addExtension("sxw");
+ extensions.addExtension("sxc");
+ extensions.addExtension("sxd");
+ extensions.addExtension("sxi");
+ setExtensions(extensions);
+ }
+
+ protected FileObject findPrimaryFile(FileObject fo) {
+ ExtensionList extensions = getExtensions();
+ if (extensions.isRegistered(fo) == false)
+ return null;
+
+ File document = FileUtil.toFile(fo);
+ JarFileSystem jarFs = new JarFileSystem();
+
+ try {
+ jarFs.setJarFile(document);
+ }
+ catch (IOException e) {
+ // TopManager.getDefault().notify(new NotifyDescriptor.Exception(e, "asdf"));
+ return null;
+ }
+ catch (Exception e) {
+ return null;
+ }
+ return fo;
+ }
+
+ protected SystemAction[] defaultActions() {
+ return new SystemAction[] {
+ SystemAction.get(OpenAction.class),
+ // SystemAction.get(MountDocumentAction.class),
+ null,
+ SystemAction.get(CutAction.class),
+ SystemAction.get(CopyAction.class),
+ SystemAction.get(PasteAction.class),
+ null,
+ SystemAction.get(DeleteAction.class),
+ SystemAction.get(RenameAction.class),
+ null,
+ // SystemAction.get(ToolsAction.class),
+ SystemAction.get(PropertiesAction.class),
+ };
+ }
+
+ protected MultiDataObject createMultiObject(FileObject primaryFile) throws DataObjectExistsException, IOException {
+ return new OfficeDocumentDataObject(primaryFile, this);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataLoaderBeanInfo.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataLoaderBeanInfo.java
new file mode 100644
index 000000000000..cea24a71b126
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataLoaderBeanInfo.java
@@ -0,0 +1,72 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.awt.Image;
+import java.beans.*;
+
+import org.openide.ErrorManager;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+public class OfficeDocumentDataLoaderBeanInfo extends SimpleBeanInfo {
+
+ // If you have additional properties:
+ /*
+ public PropertyDescriptor[] getPropertyDescriptors() {
+ try {
+ PropertyDescriptor myProp = new PropertyDescriptor("myProp", OfficeDocumentDataLoader.class);
+ myProp.setDisplayName(NbBundle.getMessage(OfficeDocumentDataLoaderBeanInfo.class, "PROP_myProp"));
+ myProp.setShortDescription(NbBundle.getMessage(OfficeDocumentDataLoaderBeanInfo.class, "HINT_myProp"));
+ return new PropertyDescriptor[] {myProp};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+ */
+
+ public BeanInfo[] getAdditionalBeanInfo() {
+ try {
+ // I.e. MultiFileLoader.class or UniFileLoader.class.
+ return new BeanInfo[] {Introspector.getBeanInfo(OfficeDocumentDataLoader.class.getSuperclass())};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+
+ public Image getIcon(int type) {
+ if (type == BeanInfo.ICON_COLOR_16x16 || type == BeanInfo.ICON_MONO_16x16) {
+ return Utilities.loadImage("org/openoffice/netbeans/modules/office/resources/OfficeIcon.gif");
+ } else {
+ return Utilities.loadImage("org/openoffice/netbeans/modules/office/resources/OfficeIcon32.gif");
+ }
+ }
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataNode.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataNode.java
new file mode 100644
index 000000000000..095b04a9f90c
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataNode.java
@@ -0,0 +1,120 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.awt.datatransfer.Transferable;
+import java.util.List;
+import java.io.*;
+
+import org.openide.loaders.*;
+import org.openide.nodes.*;
+import org.openide.util.NbBundle;
+import org.openide.filesystems.*;
+
+import org.openoffice.netbeans.modules.office.actions.OfficeDocumentCookie;
+import org.openoffice.netbeans.modules.office.nodes.OfficeDocumentChildren;
+
+/** A node to represent this object.
+ *
+ * @author tomaso
+ */
+public class OfficeDocumentDataNode extends DataNode {
+
+ public OfficeDocumentDataNode(OfficeDocumentDataObject obj) {
+ // this(obj, Children.LEAF);
+ this(obj, new OfficeDocumentChildren((OfficeDocumentCookie)
+ obj.getCookie(OfficeDocumentCookie.class)));
+ }
+
+ public OfficeDocumentDataNode(OfficeDocumentDataObject obj, Children ch) {
+ super(obj, ch);
+ setIconBase("/org/openoffice/netbeans/modules/office/resources/OfficeIcon");
+ }
+
+ protected OfficeDocumentDataObject getOfficeDocumentDataObject() {
+ return (OfficeDocumentDataObject)getDataObject();
+ }
+
+ // Allow for pasting of Script Parcels to Office Documents
+ protected void createPasteTypes(Transferable t, List ls) {
+ Node[] copies = NodeTransfer.nodes(t, NodeTransfer.COPY);
+
+ if (copies != null) {
+ for (int i = 0; i < copies.length; i++) {
+ if (copies[i] instanceof ParcelDataNode) {
+ File source = FileUtil.toFile(((ParcelDataNode)copies[i]).getDataObject().getPrimaryFile());
+ File target = FileUtil.toFile(getDataObject().getPrimaryFile());
+
+ if (source.exists() && source.canRead() &&
+ target.exists() && target.canWrite()) {
+ ls.add(new ParcelDataNode.ParcelPasteType((ParcelDataNode)copies[i], target, false));
+ }
+ }
+ }
+ }
+
+ Node[] moves = NodeTransfer.nodes(t, NodeTransfer.MOVE);
+ if (moves != null) {
+ for (int i = 0; i < moves.length; i++) {
+ if (moves[i] instanceof ParcelDataNode) {
+ File source = FileUtil.toFile(((ParcelDataNode)moves[i]).getDataObject().getPrimaryFile());
+ File target = FileUtil.toFile(getDataObject().getPrimaryFile());
+
+ if (source.exists() && source.canRead() &&
+ target.exists() && target.canWrite()) {
+ ls.add(new ParcelDataNode.ParcelPasteType((ParcelDataNode)moves[i], target, true));
+ }
+ }
+ }
+ }
+
+ // Also try superclass, but give it lower priority:
+ super.createPasteTypes(t, ls);
+ }
+
+ /* Example of adding Executor / Debugger / Arguments to node:
+ protected Sheet createSheet() {
+ Sheet sheet = super.createSheet();
+ Sheet.Set set = sheet.get(ExecSupport.PROP_EXECUTION);
+ if (set == null) {
+ set = new Sheet.Set();
+ set.setName(ExecSupport.PROP_EXECUTION);
+ set.setDisplayName(NbBundle.getMessage(OfficeDocumentDataNode.class, "LBL_DataNode_exec_sheet"));
+ set.setShortDescription(NbBundle.getMessage(OfficeDocumentDataNode.class, "HINT_DataNode_exec_sheet"));
+ }
+ ((ExecSupport)getCookie(ExecSupport.class)).addProperties(set);
+ // Maybe:
+ ((CompilerSupport)getCookie(CompilerSupport.class)).addProperties(set);
+ sheet.put(set);
+ return sheet;
+ }
+ */
+
+ // Don't use getDefaultAction(); just make that first in the data loader's getActions list
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataObject.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataObject.java
new file mode 100644
index 000000000000..b93f59d21350
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataObject.java
@@ -0,0 +1,58 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import org.openide.actions.*;
+import org.openide.cookies.*;
+import org.openide.filesystems.*;
+import org.openide.loaders.*;
+import org.openide.nodes.*;
+import org.openide.util.HelpCtx;
+
+import org.openoffice.netbeans.modules.office.actions.*;
+
+public class OfficeDocumentDataObject extends MultiDataObject {
+
+ public OfficeDocumentDataObject(FileObject pf, OfficeDocumentDataLoader loader) throws DataObjectExistsException {
+ super(pf, loader);
+ init();
+ }
+
+ private void init() {
+ CookieSet cookies = getCookieSet();
+ cookies.add(new OfficeDocumentSupport(this));
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ protected Node createNodeDelegate() {
+ return new OfficeDocumentDataNode(this);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolder.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolder.java
new file mode 100644
index 000000000000..5bca0a6b2d5a
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolder.java
@@ -0,0 +1,137 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.io.IOException;
+
+import org.openide.TopManager;
+import org.openide.NotifyDescriptor;
+import org.openide.ErrorManager;
+
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileLock;
+import org.openide.filesystems.FileUtil;
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.Repository;
+
+import org.openide.loaders.DataObject;
+import org.openide.loaders.DataFolder;
+import org.openide.loaders.DataObjectExistsException;
+
+import org.openide.nodes.Node;
+import org.openide.util.datatransfer.NewType;
+
+import org.openoffice.netbeans.modules.office.actions.ParcelFolderCookie;
+import org.openoffice.netbeans.modules.office.utils.PackageRemover;
+
+public class ParcelContentsFolder extends DataFolder {
+ public ParcelContentsFolder(FileObject pf, ParcelContentsFolderDataLoader loader)
+ throws DataObjectExistsException {
+ super(pf, loader);
+ }
+
+ public Node createNodeDelegate() {
+ return new DataFolder.FolderNode() {
+ public NewType[] getNewTypes() {
+ NewType[] newtypes = new NewType[1];
+ newtypes[0] = new NewType() {
+ public String getName() {
+ return "New Script";
+ }
+
+ public void create() {
+ DataFolder contents = (DataFolder)getDataObject();
+ ParcelFolderCookie cookie =
+ (ParcelFolderCookie)contents.getFolder().
+ getCookie(ParcelFolderCookie.class);
+
+ String language = cookie.getLanguage();
+ ParcelContentsFolder.createEmptyScript(contents,
+ language);
+ }
+ };
+ return newtypes;
+ }
+ };
+ }
+
+ public static void createEmptyScript(DataFolder parent, String language) {
+ String sourceFile = "Templates/OfficeScripting/EmptyScript/Empty";
+
+ if (language.toLowerCase().equals("java")) {
+ sourceFile += ".java";
+ }
+ else if (language.toLowerCase().equals("beanshell")) {
+ sourceFile += ".bsh";
+ }
+ else {
+ NotifyDescriptor d = new NotifyDescriptor.Message(
+ "Language not defined for this Parcel Folder");
+ TopManager.getDefault().notify(d);
+ return;
+ }
+
+ FileSystem fs = Repository.getDefault().getDefaultFileSystem();
+ DataObject result = null;
+ try {
+ DataObject dObj = DataObject.find(fs.findResource(sourceFile));
+ result = dObj.createFromTemplate(parent);
+ }
+ catch (IOException ioe) {
+ ErrorManager.getDefault().notify(ioe);
+ }
+
+ FileObject fo = result.getPrimaryFile();
+ if (fo.getExt().equals("java")) {
+ FileLock lock = null;
+ try {
+ PackageRemover.removeDeclaration(FileUtil.toFile(fo));
+
+ // IssueZilla 11986 - rename the FileObject
+ // so the JavaNode is resynchronized
+ lock = fo.lock();
+ if (lock != null) {
+ fo.rename(lock, fo.getName(), fo.getExt());
+ }
+ }
+ catch (IOException ioe) {
+ NotifyDescriptor d = new NotifyDescriptor.Message(
+ "Error removing package declaration from file: " +
+ fo.getNameExt() +
+ ". You should manually remove this declaration " +
+ "before building the Parcel Recipe");
+ TopManager.getDefault().notify(d);
+ }
+ finally {
+ if (lock != null) {
+ lock.releaseLock();
+ }
+ }
+ }
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolderDataLoader.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolderDataLoader.java
new file mode 100644
index 000000000000..4c0777cf1c25
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolderDataLoader.java
@@ -0,0 +1,82 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import org.openide.loaders.*;
+import org.openide.filesystems.FileObject;
+import org.openide.actions.*;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.SystemAction;
+
+import org.openoffice.idesupport.zip.ParcelZipper;
+
+public class ParcelContentsFolderDataLoader extends UniFileLoader {
+
+ public ParcelContentsFolderDataLoader() {
+ this("org.openide.loaders.DataFolder");
+ }
+
+ protected ParcelContentsFolderDataLoader(String recognizedObjectClass) {
+ super(recognizedObjectClass);
+ }
+
+ protected String defaultDisplayName() {
+ return "Office Script Parcel Contents";
+ }
+
+ protected void initialize() {
+ super.initialize();
+ }
+
+ protected FileObject findPrimaryFile(FileObject fo) {
+ if (fo.isFolder() == false ||
+ fo.getName().equals(ParcelZipper.CONTENTS_DIRNAME) == false ||
+ fo.getFileObject(ParcelZipper.PARCEL_DESCRIPTOR_XML) == null)
+ return null;
+
+ return fo;
+ }
+
+ protected SystemAction[] defaultActions() {
+ return new SystemAction[] {
+ SystemAction.get(PasteAction.class),
+ SystemAction.get(NewAction.class),
+ // null,
+ // SystemAction.get(PropertiesAction.class),
+ };
+ }
+
+ protected MultiDataObject createMultiObject(FileObject primaryFile)
+ throws DataObjectExistsException {
+ return new ParcelContentsFolder(primaryFile, this);
+ }
+
+ protected MultiDataObject.Entry createPrimaryEntry(MultiDataObject obj, FileObject primaryFile) {
+ return new FileEntry.Folder(obj, primaryFile);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolderDataLoaderBeanInfo.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolderDataLoaderBeanInfo.java
new file mode 100644
index 000000000000..6f1f44255945
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolderDataLoaderBeanInfo.java
@@ -0,0 +1,76 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.awt.Image;
+import java.beans.*;
+
+import org.openide.ErrorManager;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/** Description of {@link ParcelFolderDataLoader}.
+ *
+ * @author tomaso
+ */
+public class ParcelContentsFolderDataLoaderBeanInfo extends SimpleBeanInfo {
+
+ // If you have additional properties:
+ /*
+ public PropertyDescriptor[] getPropertyDescriptors() {
+ try {
+ PropertyDescriptor myProp = new PropertyDescriptor("myProp", ParcelFolderDataLoader.class);
+ myProp.setDisplayName(NbBundle.getMessage(ParcelFolderDataLoaderBeanInfo.class, "PROP_myProp"));
+ myProp.setShortDescription(NbBundle.getMessage(ParcelFolderDataLoaderBeanInfo.class, "HINT_myProp"));
+ return new PropertyDescriptor[] {myProp};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+ */
+
+ public BeanInfo[] getAdditionalBeanInfo() {
+ try {
+ // I.e. MultiFileLoader.class or UniFileLoader.class.
+ return new BeanInfo[] {Introspector.getBeanInfo(ParcelContentsFolderDataLoader.class.getSuperclass())};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+
+ public Image getIcon(int type) {
+ if (type == BeanInfo.ICON_COLOR_16x16 || type == BeanInfo.ICON_MONO_16x16) {
+ return Utilities.loadImage("org/openoffice/netbeans/modules/office/loaders/ParcelFolderDataIcon.gif");
+ } else {
+ return Utilities.loadImage("org/openoffice/netbeans/modules/office/loaders/ParcelFolderDataIcon32.gif");
+ }
+ }
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataLoader.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataLoader.java
new file mode 100644
index 000000000000..81a753bab7a0
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataLoader.java
@@ -0,0 +1,89 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.io.IOException;
+import java.io.File;
+
+import org.openide.actions.*;
+import org.openide.filesystems.*;
+import org.openide.loaders.*;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.SystemAction;
+
+import org.openoffice.netbeans.modules.office.actions.*;
+import org.openoffice.idesupport.zip.ParcelZipper;
+
+/** Recognizes single files in the Repository as being of a certain type.
+ *
+ * @author tomaso
+ */
+public class ParcelDataLoader extends UniFileLoader {
+
+ public ParcelDataLoader() {
+ this("org.openoffice.netbeans.modules.office.loader.ParcelDataObject");
+ }
+
+ // Can be useful for subclasses:
+ protected ParcelDataLoader(String recognizedObjectClass) {
+ super(recognizedObjectClass);
+ }
+
+ protected String defaultDisplayName() {
+ return "Office Script Parcel";
+ }
+
+ protected void initialize() {
+ super.initialize();
+
+ ExtensionList extensions = new ExtensionList();
+ extensions.addExtension(ParcelZipper.PARCEL_EXTENSION);
+ setExtensions(extensions);
+ }
+
+ protected SystemAction[] defaultActions() {
+ return new SystemAction[] {
+ // SystemAction.get(MountParcelAction.class),
+ SystemAction.get(DeployParcelAction.class),
+ null,
+ SystemAction.get(CutAction.class),
+ SystemAction.get(CopyAction.class),
+ // SystemAction.get(PasteAction.class),
+ null,
+ SystemAction.get(DeleteAction.class),
+ SystemAction.get(RenameAction.class),
+ null,
+ // SystemAction.get(ToolsAction.class),
+ SystemAction.get(PropertiesAction.class),
+ };
+ }
+
+ protected MultiDataObject createMultiObject(FileObject primaryFile) throws DataObjectExistsException, IOException {
+ return new ParcelDataObject(primaryFile, this);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataLoaderBeanInfo.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataLoaderBeanInfo.java
new file mode 100644
index 000000000000..3fdd32f497f4
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataLoaderBeanInfo.java
@@ -0,0 +1,76 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.awt.Image;
+import java.beans.*;
+
+import org.openide.ErrorManager;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/** Description of {@link ParcelDataLoader}.
+ *
+ * @author tomaso
+ */
+public class ParcelDataLoaderBeanInfo extends SimpleBeanInfo {
+
+ // If you have additional properties:
+ /*
+ public PropertyDescriptor[] getPropertyDescriptors() {
+ try {
+ PropertyDescriptor myProp = new PropertyDescriptor("myProp", ParcelDataLoader.class);
+ myProp.setDisplayName(NbBundle.getMessage(ParcelDataLoaderBeanInfo.class, "PROP_myProp"));
+ myProp.setShortDescription(NbBundle.getMessage(ParcelDataLoaderBeanInfo.class, "HINT_myProp"));
+ return new PropertyDescriptor[] {myProp};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+ */
+
+ public BeanInfo[] getAdditionalBeanInfo() {
+ try {
+ // I.e. MultiFileLoader.class or UniFileLoader.class.
+ return new BeanInfo[] {Introspector.getBeanInfo(ParcelDataLoader.class.getSuperclass())};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+
+ public Image getIcon(int type) {
+ if (type == BeanInfo.ICON_COLOR_16x16 || type == BeanInfo.ICON_MONO_16x16) {
+ return Utilities.loadImage("org/openoffice/netbeans/modules/office/loaders/ParcelDataIcon.gif");
+ } else {
+ return Utilities.loadImage("org/openoffice/netbeans/modules/office/loaders/ParcelDataIcon32.gif");
+ }
+ }
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataNode.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataNode.java
new file mode 100644
index 000000000000..bc6cf5a64336
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataNode.java
@@ -0,0 +1,114 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.io.*;
+import java.awt.datatransfer.Transferable;
+import java.util.zip.*;
+
+import org.openide.loaders.*;
+import org.openide.nodes.*;
+import org.openide.filesystems.FileObject;
+import org.openide.util.NbBundle;
+import org.openide.util.datatransfer.*;
+import org.openide.ErrorManager;
+import org.openide.windows.OutputWriter;
+
+import org.openoffice.netbeans.modules.office.actions.ParcelCookie;
+
+/** A node to represent this object.
+ *
+ * @author tomaso
+ */
+public class ParcelDataNode extends DataNode {
+
+ public ParcelDataNode(ParcelDataObject obj) {
+ this(obj, Children.LEAF);
+ }
+
+ public ParcelDataNode(ParcelDataObject obj, Children ch) {
+ super(obj, ch);
+ setIconBase("/org/openoffice/netbeans/modules/office/resources/ParcelIcon");
+ }
+
+ protected ParcelDataObject getParcelDataObject() {
+ return (ParcelDataObject)getDataObject();
+ }
+
+ public static class ParcelPasteType extends PasteType {
+ ParcelDataNode sourceParcel = null;
+ File targetDocument = null;
+ boolean isCut = false;
+
+ public ParcelPasteType(ParcelDataNode sourceParcel,
+ File targetDocument, boolean isCut) {
+ this.sourceParcel = sourceParcel;
+ this.targetDocument = targetDocument;
+ this.isCut = isCut;
+ }
+
+ public Transferable paste() {
+ ParcelCookie parcelCookie =
+ (ParcelCookie)sourceParcel.getCookie(ParcelCookie.class);
+ parcelCookie.deploy(targetDocument);
+
+ if (isCut == true) {
+ FileObject fo = sourceParcel.getDataObject().getPrimaryFile();
+ try {
+ fo.delete();
+ }
+ catch (IOException ioe) {}
+ return ExTransferable.EMPTY;
+ }
+ else {
+ return null;
+ }
+ }
+ }
+
+ /* Example of adding Executor / Debugger / Arguments to node:
+ protected Sheet createSheet() {
+ Sheet sheet = super.createSheet();
+ Sheet.Set set = sheet.get(ExecSupport.PROP_EXECUTION);
+ if (set == null) {
+ set = new Sheet.Set();
+ set.setName(ExecSupport.PROP_EXECUTION);
+ set.setDisplayName(NbBundle.getMessage(ParcelDataNode.class, "LBL_DataNode_exec_sheet"));
+ set.setShortDescription(NbBundle.getMessage(ParcelDataNode.class, "HINT_DataNode_exec_sheet"));
+ }
+ ((ExecSupport)getCookie(ExecSupport.class)).addProperties(set);
+ // Maybe:
+ ((CompilerSupport)getCookie(CompilerSupport.class)).addProperties(set);
+ sheet.put(set);
+ return sheet;
+ }
+ */
+
+ // Don't use getDefaultAction(); just make that first in the data loader's getActions list
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataObject.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataObject.java
new file mode 100644
index 000000000000..7aeeda69176a
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataObject.java
@@ -0,0 +1,77 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import org.openide.actions.*;
+import org.openide.cookies.*;
+import org.openide.filesystems.FileObject;
+import org.openide.loaders.*;
+import org.openide.nodes.*;
+import org.openide.util.HelpCtx;
+
+import org.openoffice.netbeans.modules.office.actions.*;
+
+/** Represents a Parcel object in the Repository.
+ *
+ * @author tomaso
+ */
+public class ParcelDataObject extends MultiDataObject {
+
+ public ParcelDataObject(FileObject pf, ParcelDataLoader loader) throws DataObjectExistsException {
+ super(pf, loader);
+ init();
+ }
+
+ private void init() {
+ CookieSet cookies = getCookieSet();
+ cookies.add(new ParcelSupport(getPrimaryFile()));
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ // If you add context help, change to:
+ // return new HelpCtx(ParcelDataObject.class);
+ }
+
+ protected Node createNodeDelegate() {
+ return new ParcelDataNode(this);
+ }
+
+ /* If you made an Editor Support you will want to add these methods:
+
+ final void addSaveCookie(SaveCookie save) {
+ getCookieSet().add(save);
+ }
+
+ final void removeSaveCookie(SaveCookie save) {
+ getCookieSet().remove(save);
+ }
+
+ */
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataLoader.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataLoader.java
new file mode 100644
index 000000000000..80fbcd99ee58
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataLoader.java
@@ -0,0 +1,91 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.io.IOException;
+
+import org.openide.actions.*;
+import org.openide.filesystems.*;
+import org.openide.loaders.*;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.SystemAction;
+
+import org.openoffice.idesupport.OfficeDocument;
+
+/** Recognizes single files in the Repository as being of a certain type.
+ *
+ * @author tomaso
+ */
+public class ParcelDescriptorDataLoader extends UniFileLoader {
+
+ public ParcelDescriptorDataLoader() {
+ this("org.openoffice.netbeans.modules.office.loader.ParcelDescriptorDataObject");
+ }
+
+ // Can be useful for subclasses:
+ protected ParcelDescriptorDataLoader(String recognizedObjectClass) {
+ super(recognizedObjectClass);
+ }
+
+ protected String defaultDisplayName() {
+ return OfficeDocument.OFFICE_PRODUCT_NAME + " Script Parcel Descriptor";
+ }
+
+ protected void initialize() {
+ super.initialize();
+
+ // ExtensionList extensions = new ExtensionList();
+ // extensions.addMimeType("text/x-parcel+xml");
+ // extensions.addExtension("pml");
+ getExtensions().addMimeType("text/x-parcel+xml");
+ // setExtensions(extensions);
+ }
+
+ protected SystemAction[] defaultActions() {
+ return new SystemAction[] {
+ SystemAction.get(OpenAction.class),
+ // SystemAction.get(GenerateParcelAction.class),
+ null,
+ SystemAction.get(CutAction.class),
+ SystemAction.get(CopyAction.class),
+ SystemAction.get(PasteAction.class),
+ null,
+ SystemAction.get(DeleteAction.class),
+ SystemAction.get(RenameAction.class),
+ null,
+ // SystemAction.get(SaveAsTemplateAction.class),
+ // null,
+ // SystemAction.get(ToolsAction.class),
+ SystemAction.get(PropertiesAction.class),
+ };
+ }
+
+ protected MultiDataObject createMultiObject(FileObject primaryFile) throws DataObjectExistsException, IOException {
+ return new ParcelDescriptorDataObject(primaryFile, this);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataLoaderBeanInfo.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataLoaderBeanInfo.java
new file mode 100644
index 000000000000..42b89fdf86ed
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataLoaderBeanInfo.java
@@ -0,0 +1,76 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.awt.Image;
+import java.beans.*;
+
+import org.openide.ErrorManager;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/** Description of {@link ParcelDescriptorDataLoader}.
+ *
+ * @author tomaso
+ */
+public class ParcelDescriptorDataLoaderBeanInfo extends SimpleBeanInfo {
+
+ // If you have additional properties:
+ /*
+ public PropertyDescriptor[] getPropertyDescriptors() {
+ try {
+ PropertyDescriptor myProp = new PropertyDescriptor("myProp", ParcelDescriptorDataLoader.class);
+ myProp.setDisplayName(NbBundle.getMessage(ParcelDescriptorDataLoaderBeanInfo.class, "PROP_myProp"));
+ myProp.setShortDescription(NbBundle.getMessage(ParcelDescriptorDataLoaderBeanInfo.class, "HINT_myProp"));
+ return new PropertyDescriptor[] {myProp};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+ */
+
+ public BeanInfo[] getAdditionalBeanInfo() {
+ try {
+ // I.e. MultiFileLoader.class or UniFileLoader.class.
+ return new BeanInfo[] {Introspector.getBeanInfo(ParcelDescriptorDataLoader.class.getSuperclass())};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+
+ public Image getIcon(int type) {
+ if (type == BeanInfo.ICON_COLOR_16x16 || type == BeanInfo.ICON_MONO_16x16) {
+ return Utilities.loadImage("org/openoffice/netbeans/modules/office/loaders/ParcelDescriptorDataIcon.gif");
+ } else {
+ return Utilities.loadImage("org/openoffice/netbeans/modules/office/loaders/ParcelDescriptorDataIcon32.gif");
+ }
+ }
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataNode.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataNode.java
new file mode 100644
index 000000000000..440e91cbabf4
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataNode.java
@@ -0,0 +1,81 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import org.openide.loaders.*;
+import org.openide.nodes.*;
+import org.openide.util.NbBundle;
+
+import org.openoffice.netbeans.modules.office.nodes.*;
+import org.openoffice.netbeans.modules.office.actions.*;
+
+/** A node to represent this object.
+ *
+ * @author tomaso
+ */
+public class ParcelDescriptorDataNode extends DataNode {
+
+ public ParcelDescriptorDataNode(ParcelDescriptorDataObject obj) {
+ this(obj, Children.LEAF);
+ }
+
+ public ParcelDescriptorDataNode(ParcelDescriptorDataObject obj, Children ch) {
+ super(obj, ch);
+ setHidden(true);
+ setIconBase("/org/openoffice/netbeans/modules/office/resources/OfficeIcon");
+ }
+
+ protected ParcelDescriptorDataObject getParcelDescriptorDataObject() {
+ return (ParcelDescriptorDataObject)getDataObject();
+ }
+
+ public boolean canRename() {
+ return false;
+ }
+
+ /* Example of adding Executor / Debugger / Arguments to node:
+ protected Sheet createSheet() {
+ Sheet sheet = super.createSheet();
+ Sheet.Set set = sheet.get(ExecSupport.PROP_EXECUTION);
+ if (set == null) {
+ set = new Sheet.Set();
+ set.setName(ExecSupport.PROP_EXECUTION);
+ set.setDisplayName(NbBundle.getMessage(ParcelDescriptorDataNode.class, "LBL_DataNode_exec_sheet"));
+ set.setShortDescription(NbBundle.getMessage(ParcelDescriptorDataNode.class, "HINT_DataNode_exec_sheet"));
+ }
+ ((ExecSupport)getCookie(ExecSupport.class)).addProperties(set);
+ // Maybe:
+ ((CompilerSupport)getCookie(CompilerSupport.class)).addProperties(set);
+ sheet.put(set);
+ return sheet;
+ }
+ */
+
+ // Don't use getDefaultAction(); just make that first in the data loader's getActions list
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataObject.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataObject.java
new file mode 100644
index 000000000000..9a80dcd5534b
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataObject.java
@@ -0,0 +1,83 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import org.openide.actions.*;
+import org.openide.cookies.*;
+import org.openide.filesystems.*;
+import org.openide.loaders.*;
+import org.openide.nodes.*;
+import org.openide.util.HelpCtx;
+
+import org.openoffice.netbeans.modules.office.actions.ParcelDescriptorEditorSupport;
+import org.openoffice.netbeans.modules.office.actions.ParcelDescriptorParserSupport;
+
+/** Represents a ParcelDescriptor object in the Repository.
+ *
+ * @author tomaso
+ */
+public class ParcelDescriptorDataObject extends MultiDataObject {
+
+ private boolean canParse = false;
+
+ public ParcelDescriptorDataObject(FileObject pf, ParcelDescriptorDataLoader loader) throws DataObjectExistsException {
+ super(pf, loader);
+ init();
+ }
+
+ private void init() {
+ FileObject fo = getPrimaryFile();
+ if (FileUtil.toFile(fo) != null)
+ canParse = true;
+
+ CookieSet cookies = getCookieSet();
+ cookies.add(new ParcelDescriptorEditorSupport(this));
+ if (canParse == true)
+ cookies.add(new ParcelDescriptorParserSupport(getPrimaryFile()));
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ protected Node createNodeDelegate() {
+ if (canParse == true)
+ return new ParcelDescriptorDataNode(this);
+ else
+ return new ParcelDescriptorDataNode(this, Children.LEAF);
+ }
+
+ // If you made an Editor Support you will want to add these methods:
+ public final void addSaveCookie(SaveCookie save) {
+ getCookieSet().add(save);
+ }
+
+ public final void removeSaveCookie(SaveCookie save) {
+ getCookieSet().remove(save);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolder.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolder.java
new file mode 100644
index 000000000000..44d04be0414a
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolder.java
@@ -0,0 +1,303 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.io.File;
+import java.io.IOException;
+import java.beans.PropertyEditor;
+import java.beans.PropertyEditorSupport;
+
+import org.openide.loaders.DataFolder;
+import org.openide.loaders.DataObject;
+import org.openide.loaders.DataFilter;
+import org.openide.loaders.DataObjectExistsException;
+
+import org.openide.filesystems.FileObject;
+import org.openide.filesystems.FileUtil;
+
+import org.openide.nodes.CookieSet;
+import org.openide.nodes.Node;
+import org.openide.nodes.PropertySupport;
+import org.openide.nodes.Sheet;
+import org.openide.util.HelpCtx;
+
+import org.openoffice.idesupport.filter.*;
+import org.openoffice.idesupport.zip.ParcelZipper;
+import org.openoffice.netbeans.modules.office.actions.ParcelFolderCookie;
+import org.openoffice.netbeans.modules.office.actions.ParcelFolderSupport;
+
+public class ParcelFolder extends DataFolder {
+
+ public static final String LANGUAGE_ATTRIBUTE = "language";
+
+ public ParcelFolder(FileObject pf, ParcelFolderDataLoader loader)
+ throws DataObjectExistsException {
+ super(pf, loader);
+ CookieSet cookies = getCookieSet();
+ cookies.add(new ParcelFolderSupport(this));
+ }
+
+ public Node createNodeDelegate() {
+ return new ParcelFolderNode(this, new ParcelFolderFilter());
+ }
+
+ public class ParcelFolderNode extends DataFolder.FolderNode {
+ private static final String LOCATION = "location";
+ private static final String FILTER = "filter";
+ private static final String LANGUAGE = LANGUAGE_ATTRIBUTE;
+ private static final String CLASSPATH = "classpath";
+
+ private File location;
+ private FileFilter filter;
+ private String language;
+ private String classpath;
+
+ private final FileFilter DEFAULT_FILTER = BinaryOnlyFilter.getInstance();
+
+ public ParcelFolderNode(ParcelFolder pf, DataFilter dataFilter) {
+ super(pf.createNodeChildren(dataFilter));
+
+ location = (File)pf.getPrimaryFile().getAttribute(LOCATION);
+ if (location == null)
+ location = FileUtil.toFile(pf.getPrimaryFile());
+
+ String name = (String)pf.getPrimaryFile().getAttribute(FILTER);
+ if (name == null)
+ filter = DEFAULT_FILTER;
+ else {
+ for (int i = 0; i < availableFilters.length; i++)
+ if (name.equals(availableFilters[i].toString()))
+ filter = availableFilters[i];
+ }
+
+ language = (String)pf.getPrimaryFile().getAttribute(LANGUAGE);
+
+ ParcelFolderCookie cookie =
+ (ParcelFolderCookie)pf.getCookie(ParcelFolderCookie.class);
+ String s = cookie.getClasspath();
+ if (s != null) {
+ classpath = s;
+ }
+ else {
+ classpath = ".";
+ cookie.setClasspath(classpath);
+ }
+ }
+
+ public File getTargetDir() {
+ return location;
+ }
+
+ public FileFilter getFileFilter() {
+ return filter;
+ }
+
+ public String getLanguage() {
+ if (language == null)
+ language = (String)getPrimaryFile().getAttribute(LANGUAGE);
+ return language;
+ }
+
+ public Sheet createSheet() {
+ Sheet sheet;
+ Sheet.Set props;
+ Node.Property prop;
+
+ sheet = super.createSheet();
+ props = sheet.get(Sheet.PROPERTIES);
+ if (props == null) {
+ props = Sheet.createPropertiesSet();
+ sheet.put(props);
+ }
+
+ // prop = createLocationProperty();
+ // props.put(prop);
+
+ prop = createFilterProperty();
+ props.put(prop);
+
+ prop = createFilterProperty();
+ props.put(prop);
+
+ // prop = createLanguageProperty();
+ // props.put(prop);
+
+ prop = createClasspathProperty();
+ props.put(prop);
+
+ return sheet;
+ }
+
+ private Node.Property createLocationProperty() {
+ Node.Property prop =
+ new PropertySupport.ReadWrite(LOCATION, File.class,
+ "Location", "Output location of Parcel Zip File") {
+ public void setValue(Object obj) {
+ if (obj instanceof File) {
+ location = (File)obj;
+ try {
+ getPrimaryFile().setAttribute(LOCATION, location);
+ }
+ catch (IOException ioe) {
+ }
+ }
+ }
+
+ public Object getValue() {
+ return location;
+ }
+ };
+ prop.setValue("files", Boolean.FALSE);
+ return prop;
+ }
+
+ private String[] languages = {"Java", "BeanShell"};
+
+ private Node.Property createLanguageProperty() {
+ Node.Property prop =
+ new PropertySupport.ReadWrite(LANGUAGE, String.class,
+ "Parcel Language", "Language of scripts in this Parcel") {
+ public void setValue(Object obj) {
+ if (obj instanceof String) {
+ language = (String)obj;
+
+ try {
+ getPrimaryFile().setAttribute(LANGUAGE, language);
+ }
+ catch (IOException ioe) {
+ }
+ }
+ }
+
+ public Object getValue() {
+ if (language == null)
+ language = (String)getPrimaryFile().getAttribute(LANGUAGE);
+ return language;
+ }
+
+ public PropertyEditor getPropertyEditor() {
+ return new PropertyEditorSupport() {
+ public String[] getTags() {
+ return languages;
+ }
+
+ public void setAsText(String text) {
+ for (int i = 0; i < languages.length; i++)
+ if (text.equals(languages[i]))
+ this.setValue(languages[i]);
+ }
+
+ public String getAsText() {
+ return (String)this.getValue();
+ }
+ };
+ }
+ };
+ return prop;
+ }
+
+ private FileFilter[] availableFilters = new FileFilter[] {
+ BinaryOnlyFilter.getInstance(), AllFilesFilter.getInstance()};
+
+ private Node.Property createFilterProperty() {
+ Node.Property prop =
+ new PropertySupport.ReadWrite(FILTER, String.class,
+ "File Filter", "Files to be included in Parcel") {
+ public void setValue(Object obj) {
+ if (obj instanceof FileFilter) {
+ filter = (FileFilter)obj;
+
+ try {
+ getPrimaryFile().setAttribute(FILTER, filter.toString());
+ }
+ catch (IOException ioe) {
+ }
+ }
+ }
+
+ public Object getValue() {
+ return filter;
+ }
+
+ public PropertyEditor getPropertyEditor() {
+ return new PropertyEditorSupport() {
+ public String[] getTags() {
+ String[] tags = new String[availableFilters.length];
+
+ for (int i = 0; i < availableFilters.length; i++)
+ tags[i] = availableFilters[i].toString();
+
+ return tags;
+ }
+
+ public void setAsText(String text) {
+ for (int i = 0; i < availableFilters.length; i++)
+ if (text.equals(availableFilters[i].toString()))
+ this.setValue(availableFilters[i]);
+ }
+
+ public String getAsText() {
+ return this.getValue().toString();
+ }
+ };
+ }
+ };
+ return prop;
+ }
+
+ private Node.Property createClasspathProperty() {
+ Node.Property prop =
+ new PropertySupport.ReadWrite(CLASSPATH, String.class,
+ "Classpath", "Classpath property for scripts in this parcel") {
+ public void setValue(Object obj) {
+ if (obj instanceof String) {
+ classpath = (String)obj;
+
+ ParcelFolderCookie cookie = (ParcelFolderCookie)
+ getDataObject().getCookie(ParcelFolderCookie.class);
+ cookie.setClasspath(classpath);
+ }
+ }
+
+ public Object getValue() {
+ return classpath;
+ }
+ };
+ return prop;
+ }
+ }
+
+ private class ParcelFolderFilter implements DataFilter {
+ public boolean acceptDataObject(DataObject dobj) {
+ String name = dobj.getPrimaryFile().getNameExt();
+ if (name.equals(ParcelZipper.PARCEL_DESCRIPTOR_XML))
+ return false;
+ return true;
+ }
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolderDataLoader.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolderDataLoader.java
new file mode 100644
index 000000000000..ee3957ccb2ef
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolderDataLoader.java
@@ -0,0 +1,112 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.io.IOException;
+import java.io.File;
+
+import org.openide.actions.*;
+import org.openide.filesystems.*;
+import org.openide.loaders.*;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.SystemAction;
+
+import org.openoffice.idesupport.zip.ParcelZipper;
+import org.openoffice.netbeans.modules.office.actions.*;
+
+/** Recognizes single files in the Repository as being of a certain type.
+ *
+ * @author tomaso
+ */
+
+public class ParcelFolderDataLoader extends UniFileLoader {
+
+ public ParcelFolderDataLoader() {
+ this("org.openoffice.netbeans.modules.office.loader.ParcelFolder");
+ }
+
+ protected ParcelFolderDataLoader(String recognizedObjectClass) {
+ super(recognizedObjectClass);
+ }
+
+ protected String defaultDisplayName() {
+ return "Office Script Parcel Folder";
+ }
+
+ protected void initialize() {
+ super.initialize();
+ }
+
+ protected FileObject findPrimaryFile(FileObject fo) {
+ if (fo.isFolder() == false)
+ return null;
+
+ FileObject contents = fo.getFileObject(ParcelZipper.CONTENTS_DIRNAME);
+ if (contents == null)
+ return null;
+
+ FileObject descriptor = contents.getFileObject(ParcelZipper.PARCEL_DESCRIPTOR_XML);
+ if (descriptor == null)
+ return null;
+
+ return fo;
+ }
+
+ protected SystemAction[] defaultActions() {
+ return new SystemAction[] {
+ // SystemAction.get(OpenLocalExplorerAction.class),
+ // SystemAction.get(FindAction.class),
+ // null,
+ // SystemAction.get(FileSystemAction.class),
+ // null,
+ SystemAction.get(CompileParcelAction.class),
+ SystemAction.get(BuildParcelAction.class),
+ SystemAction.get(ConfigureParcelAction.class),
+ null,
+ SystemAction.get(CutAction.class),
+ SystemAction.get(CopyAction.class),
+ // SystemAction.get(PasteAction.class),
+ null,
+ SystemAction.get(DeleteAction.class),
+ SystemAction.get(RenameAction.class),
+ null,
+ // SystemAction.get(SaveAsTemplateAction.class),
+ // null,
+ // SystemAction.get(ToolsAction.class),
+ SystemAction.get(PropertiesAction.class),
+ };
+ }
+
+ protected MultiDataObject createMultiObject(FileObject primaryFile) throws DataObjectExistsException, IOException {
+ return new ParcelFolder(primaryFile, this);
+ }
+
+ protected MultiDataObject.Entry createPrimaryEntry(MultiDataObject obj, FileObject primaryFile) {
+ return new FileEntry.Folder(obj, primaryFile);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolderDataLoaderBeanInfo.java b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolderDataLoaderBeanInfo.java
new file mode 100644
index 000000000000..68888dde3c52
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolderDataLoaderBeanInfo.java
@@ -0,0 +1,76 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.loader;
+
+import java.awt.Image;
+import java.beans.*;
+
+import org.openide.ErrorManager;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+/** Description of {@link ParcelFolderDataLoader}.
+ *
+ * @author tomaso
+ */
+public class ParcelFolderDataLoaderBeanInfo extends SimpleBeanInfo {
+
+ // If you have additional properties:
+ /*
+ public PropertyDescriptor[] getPropertyDescriptors() {
+ try {
+ PropertyDescriptor myProp = new PropertyDescriptor("myProp", ParcelFolderDataLoader.class);
+ myProp.setDisplayName(NbBundle.getMessage(ParcelFolderDataLoaderBeanInfo.class, "PROP_myProp"));
+ myProp.setShortDescription(NbBundle.getMessage(ParcelFolderDataLoaderBeanInfo.class, "HINT_myProp"));
+ return new PropertyDescriptor[] {myProp};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+ */
+
+ public BeanInfo[] getAdditionalBeanInfo() {
+ try {
+ // I.e. MultiFileLoader.class or UniFileLoader.class.
+ return new BeanInfo[] {Introspector.getBeanInfo(ParcelFolderDataLoader.class.getSuperclass())};
+ } catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+
+ public Image getIcon(int type) {
+ if (type == BeanInfo.ICON_COLOR_16x16 || type == BeanInfo.ICON_MONO_16x16) {
+ return Utilities.loadImage("org/openoffice/netbeans/modules/office/loaders/ParcelFolderDataIcon.gif");
+ } else {
+ return Utilities.loadImage("org/openoffice/netbeans/modules/office/loaders/ParcelFolderDataIcon32.gif");
+ }
+ }
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/nodes/OfficeDocumentChildren.java b/scripting/java/org/openoffice/netbeans/modules/office/nodes/OfficeDocumentChildren.java
new file mode 100644
index 000000000000..83a239367c58
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/nodes/OfficeDocumentChildren.java
@@ -0,0 +1,147 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.nodes;
+
+import java.io.IOException;
+import java.util.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openide.nodes.*;
+import org.openide.actions.*;
+import org.openide.util.actions.SystemAction;
+import org.openide.util.HelpCtx;
+
+import org.openoffice.netbeans.modules.office.options.OfficeSettings;
+import org.openoffice.netbeans.modules.office.utils.NagDialog;
+import org.openoffice.netbeans.modules.office.actions.OfficeDocumentCookie;
+
+public class OfficeDocumentChildren extends Children.Keys
+ implements ChangeListener {
+
+ private OfficeDocumentCookie document = null;
+
+ public OfficeDocumentChildren(OfficeDocumentCookie cookie) {
+ document = cookie;
+ }
+
+ private void refreshKeys() {
+ if (document == null) {
+ setKeys(Collections.EMPTY_SET);
+ return;
+ }
+
+ Enumeration parcels = document.getParcels();
+ if (parcels.hasMoreElements() != true) {
+ setKeys(Collections.EMPTY_SET);
+ return;
+ }
+
+ ArrayList keys = new ArrayList();
+ while (parcels.hasMoreElements()) {
+ String parcel = (String)parcels.nextElement();
+ keys.add(parcel);
+ }
+ setKeys(keys);
+ }
+
+ protected void addNotify() {
+ super.addNotify();
+ document.addChangeListener(this);
+ refreshKeys();
+ }
+
+ protected void removeNotify() {
+ super.removeNotify();
+ document.removeChangeListener(this);
+ setKeys(Collections.EMPTY_SET);
+ }
+
+ protected Node[] createNodes(Object key) {
+ String name = (String)key;
+ return new Node[] {new ParcelNode(name)};
+ }
+
+ public void stateChanged(ChangeEvent e) {
+ refreshKeys();
+ }
+
+ private class ParcelNode extends AbstractNode {
+ private String name;
+
+ public ParcelNode(String name) {
+ super(Children.LEAF);
+ this.name = name;
+ init();
+ }
+
+ private void init() {
+ setIconBase("/org/openoffice/netbeans/modules/office/resources/ParcelIcon");
+
+ setName(name);
+ setDisplayName(name.substring(name.lastIndexOf("/") + 1));
+ setShortDescription(name);
+ }
+
+ protected SystemAction[] createActions() {
+ return new SystemAction[] {
+ SystemAction.get(DeleteAction.class),
+ };
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ public boolean canDestroy() {
+ return true;
+ }
+
+ public void destroy() throws IOException {
+ OfficeSettings settings = OfficeSettings.getDefault();
+ String message = "If you already have this document open in " +
+ "Office, please close it before continuing. Click OK to " +
+ "delete this parcel.";
+
+ if (settings.getWarnBeforeParcelDelete() == true) {
+ NagDialog warning = NagDialog.createConfirmationDialog(
+ message, "Show this message in future", true);
+
+ boolean result = warning.show();
+
+ if (warning.getState() == false)
+ settings.setWarnBeforeParcelDelete(false);
+
+ if (result == false)
+ return;
+ }
+ super.destroy();
+ document.removeParcel(name);
+ }
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/nodes/ParcelDescriptorChildren.java b/scripting/java/org/openoffice/netbeans/modules/office/nodes/ParcelDescriptorChildren.java
new file mode 100644
index 000000000000..e503cdb98964
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/nodes/ParcelDescriptorChildren.java
@@ -0,0 +1,91 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.nodes;
+
+import java.util.*;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Element;
+
+import org.openide.nodes.*;
+import org.openoffice.netbeans.modules.office.actions.ParcelDescriptorParserCookie;
+
+/** List of children of a containing node.
+ * Remember to document what your permitted keys are!
+ *
+ * @author tomaso
+ */
+public class ParcelDescriptorChildren extends Children.Keys implements ChangeListener {
+
+ private ParcelDescriptorParserCookie parserCookie = null;
+
+ public ParcelDescriptorChildren(ParcelDescriptorParserCookie cookie) {
+ parserCookie = cookie;
+ }
+
+ private void refreshKeys() {
+ NodeList nl;
+ int len;
+
+ if (parserCookie == null ||
+ (nl = parserCookie.getScriptElements()) == null ||
+ (len = nl.getLength()) == 0) {
+ setKeys(Collections.EMPTY_SET);
+ return;
+ }
+
+ ArrayList keys = new ArrayList(len);
+ for (int i = 0; i < len; i++)
+ keys.add(nl.item(i));
+ setKeys(keys);
+ }
+
+ protected void addNotify() {
+ super.addNotify();
+ parserCookie.addChangeListener(this);
+ refreshKeys();
+ }
+
+ protected void removeNotify() {
+ super.removeNotify();
+ parserCookie.removeChangeListener(this);
+ setKeys(Collections.EMPTY_SET);
+ }
+
+ protected Node[] createNodes(Object key) {
+ Element el = (Element)key;
+ System.out.println("element is: " + el);
+ return new Node[] {new ScriptNode(el)};
+ }
+
+ public void stateChanged(ChangeEvent e) {
+ refreshKeys();
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/nodes/ScriptNode.java b/scripting/java/org/openoffice/netbeans/modules/office/nodes/ScriptNode.java
new file mode 100644
index 000000000000..9606fc93b269
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/nodes/ScriptNode.java
@@ -0,0 +1,209 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.nodes;
+
+import org.w3c.dom.*;
+
+import org.openide.actions.*;
+import org.openide.nodes.*;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.SystemAction;
+
+/** A simple node with no children.
+ *
+ * @author tomaso
+ */
+public class ScriptNode extends AbstractNode {
+ private Element element;
+ private static final String LOGICAL_NAME = "logicalname";
+ private static final String LANGUAGE_NAME = "languagename";
+
+ public ScriptNode(Element element) {
+ super(Children.LEAF);
+ this.element = element;
+ init();
+ }
+
+ private void init() {
+ setIconBase("/org/openoffice/netbeans/modules/office/resources/OfficeIcon");
+ setDefaultAction(SystemAction.get(PropertiesAction.class));
+
+ NodeList nl = element.getElementsByTagName(LOGICAL_NAME);
+ Element nameElement = (Element)nl.item(0);
+
+ String name = nameElement.getAttribute("value");
+ setName(name);
+ setDisplayName(name.substring(name.lastIndexOf(".") + 1));
+ setShortDescription(name);
+ }
+
+ protected SystemAction[] createActions() {
+ return new SystemAction[] {
+ SystemAction.get(ToolsAction.class),
+ null,
+ SystemAction.get(PropertiesAction.class),
+ };
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ // RECOMMENDED - handle cloning specially (so as not to invoke the overhead of FilterNode):
+ /*
+ public Node cloneNode() {
+ // Try to pass in similar constructor params to what you originally got:
+ return new ScriptNode();
+ }
+ */
+
+ protected Sheet createSheet() {
+ Sheet sheet = super.createSheet();
+ Sheet.Set props = sheet.get(Sheet.PROPERTIES);
+ if (props == null) {
+ props = Sheet.createPropertiesSet();
+ sheet.put(props);
+ }
+
+ org.openide.nodes.Node.Property prop = null;
+ if ((prop = getStringProperty(LOGICAL_NAME)) != null)
+ props.put(prop);
+
+ if ((prop = getStringProperty(LANGUAGE_NAME)) != null)
+ props.put(prop);
+
+ return sheet;
+ }
+
+ private org.openide.nodes.Node.Property getStringProperty(String name) {
+ NodeList nl = element.getElementsByTagName(name);
+ if(nl.getLength() != 1)
+ return null;
+
+ Element nameElement = (Element)nl.item(0);
+ String value = nameElement.getAttribute("value");
+
+ return new StringProperty(this, name, value);
+ }
+
+ private class StringProperty extends PropertySupport.ReadOnly {
+ private String name, value;
+ private ScriptNode sn;
+
+ public StringProperty(ScriptNode sn, String name, String value) {
+ super(value, String.class, name,
+ "The name of the java language method for this script");
+ this.sn = sn;
+ this.name = name;
+ this.value = value;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ /* public void setValue(Object obj) {
+ System.out.println("Setting value to: " + obj.toString());
+
+ if ((value instanceof String) != true)
+ throw new IllegalArgumentException(name +
+ " property must be of type String");
+
+ value = obj.toString();
+ if (name.equals(LOGICAL_NAME)) {
+ sn.setName(value);
+ sn.setDisplayName(value.substring(value.lastIndexOf(".") + 1));
+ sn.setShortDescription(value);
+ }
+ } */
+ }
+
+ /* public boolean canRename() {
+ return true;
+ }
+
+ public void setName(String nue) {
+ // Update visible name, fire property changes:
+ super.setName(nue);
+ } */
+
+ /*
+ public boolean canDestroy() {
+ return true;
+ }
+ public void destroy() throws IOException {
+ // Actually remove the node itself and fire property changes:
+ super.destroy();
+ // perform additional actions, i.e. delete underlying object
+ } */
+
+ // Handle copying and cutting specially:
+ /*
+ public boolean canCopy() {
+ return true;
+ }
+ public boolean canCut() {
+ return true;
+ }
+ public Transferable clipboardCopy() {
+ // Add to, do not replace, the default node copy flavor:
+ ExTransferable et = ExTransferable.create(super.clipboardCopy());
+ et.put(new ExTransferable.Single(DataFlavor.stringFlavor) {
+ protected Object getData() {
+ return ScriptNode.this.getDisplayName();
+ }
+ });
+ return et;
+ }
+ public Transferable clipboardCut() {
+ // Add to, do not replace, the default node cut flavor:
+ ExTransferable et = ExTransferable.create(super.clipboardCut());
+ // This is not so useful because this node will not be destroyed afterwards
+ // (it is up to the paste type to decide whether to remove the "original",
+ // and it is not safe to assume that getData will only be called once):
+ et.put(new ExTransferable.Single(DataFlavor.stringFlavor) {
+ protected Object getData() {
+ return ScriptNode.this.getDisplayName();
+ }
+ });
+ return et;
+ }
+ */
+
+ // Permit user to customize whole node at once (instead of per-property):
+ /*
+ public boolean hasCustomizer() {
+ return true;
+ }
+ public Component getCustomizer() {
+ return new MyCustomizingPanel(this);
+ }
+ */
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/options/Bundle.properties b/scripting/java/org/openoffice/netbeans/modules/office/options/Bundle.properties
new file mode 100644
index 000000000000..6a9112e8c768
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/options/Bundle.properties
@@ -0,0 +1,14 @@
+# Options API
+# x-no-translate
+LBL_settings=Office Settings
+PROP_OfficeDirectory=Path to Office installation
+HINT_OfficeDirectory=Path to the Office installation
+
+HINT_WarnBeforeDocDeploy=Pop up a dialog before deploying to a document
+PROP_WarnBeforeDocDeploy=Pop up a dialog before deploying to a document
+
+HINT_WarnAfterDirDeploy=Pop up a dialog after deploying to a directory
+PROP_WarnAfterDirDeploy=Pop up a dialog after deploying to a directory
+
+HINT_WarnBeforeMount=Warn before mounting Office Scripting Framework support jar
+PROP_WarnBeforeMount=Warn before mounting Office Scripting Framework support jar
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettings.java b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettings.java
new file mode 100644
index 000000000000..3d33e214f736
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettings.java
@@ -0,0 +1,133 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.options;
+
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.io.File;
+import java.io.IOException;
+
+import org.openide.options.SystemOption;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+
+import org.openoffice.idesupport.SVersionRCFile;
+import org.openoffice.idesupport.OfficeInstallation;
+
+/** Options for something or other.
+ *
+ * @author tomaso
+ */
+public class OfficeSettings extends SystemOption {
+
+ // private static final long serialVersionUID = ...;
+
+ public static final String OFFICE_DIRECTORY = "OfficeDirectory";
+ public static final String WARN_BEFORE_DOC_DEPLOY = "WarnBeforeDocDeploy";
+ public static final String WARN_BEFORE_PARCEL_DELETE = "WarnBeforeParcelDelete";
+ public static final String WARN_AFTER_DIR_DEPLOY = "WarnAfterDirDeploy";
+ public static final String WARN_BEFORE_MOUNT = "WarnBeforeMount";
+
+ protected void initialize() {
+ super.initialize();
+
+ setWarnBeforeDocDeploy(true);
+ setWarnBeforeParcelDelete(true);
+ setWarnAfterDirDeploy(true);
+ setWarnBeforeMount(true);
+
+ if (getOfficeDirectory() == null) {
+ SVersionRCFile sversion = SVersionRCFile.createInstance();
+
+ try {
+ Enumeration enum = sversion.getVersions();
+ OfficeInstallation oi;
+
+ while (enum.hasMoreElements()) {
+ oi = (OfficeInstallation)enum.nextElement();
+ setOfficeDirectory(oi);
+ return;
+ }
+ }
+ catch (IOException ioe) {
+ }
+ }
+ }
+
+ public String displayName() {
+ return "Office Settings";
+ }
+
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ public static OfficeSettings getDefault() {
+ return (OfficeSettings)findObject(OfficeSettings.class, true);
+ }
+
+ public OfficeInstallation getOfficeDirectory() {
+ return (OfficeInstallation)getProperty(OFFICE_DIRECTORY);
+ }
+
+ public void setOfficeDirectory(OfficeInstallation oi) {
+ putProperty(OFFICE_DIRECTORY, oi, true);
+ }
+
+ public boolean getWarnBeforeDocDeploy() {
+ return ((Boolean)getProperty(WARN_BEFORE_DOC_DEPLOY)).booleanValue();
+ }
+
+ public void setWarnBeforeDocDeploy(boolean value) {
+ putProperty(WARN_BEFORE_DOC_DEPLOY, new Boolean(value), true);
+ }
+
+ public boolean getWarnBeforeParcelDelete() {
+ return ((Boolean)getProperty(WARN_BEFORE_PARCEL_DELETE)).booleanValue();
+ }
+
+ public void setWarnBeforeParcelDelete(boolean value) {
+ putProperty(WARN_BEFORE_PARCEL_DELETE, new Boolean(value), true);
+ }
+
+ public boolean getWarnAfterDirDeploy() {
+ return ((Boolean)getProperty(WARN_AFTER_DIR_DEPLOY)).booleanValue();
+ }
+
+ public void setWarnAfterDirDeploy(boolean value) {
+ putProperty(WARN_AFTER_DIR_DEPLOY, new Boolean(value), true);
+ }
+
+ public boolean getWarnBeforeMount() {
+ return ((Boolean)getProperty(WARN_BEFORE_MOUNT)).booleanValue();
+ }
+
+ public void setWarnBeforeMount(boolean value) {
+ putProperty(WARN_BEFORE_MOUNT, new Boolean(value), true);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsBeanInfo.java b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsBeanInfo.java
new file mode 100644
index 000000000000..f9747d7db398
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsBeanInfo.java
@@ -0,0 +1,147 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.options;
+
+import java.awt.Image;
+import java.awt.Component;
+import javax.swing.event.ChangeListener;
+import javax.swing.event.ChangeEvent;
+import java.beans.*;
+
+import org.openide.ErrorManager;
+import org.openide.util.NbBundle;
+import org.openide.util.Utilities;
+
+import org.openoffice.idesupport.OfficeInstallation;
+import org.openoffice.netbeans.modules.office.wizard.SelectPathPanel;
+
+/** Description of {@link OfficeSettings}.
+ *
+ * @author tomaso
+ */
+public class OfficeSettingsBeanInfo extends SimpleBeanInfo {
+
+ public PropertyDescriptor[] getPropertyDescriptors() {
+ try {
+ PropertyDescriptor[] props = new PropertyDescriptor[] {
+ new PropertyDescriptor(OfficeSettings.OFFICE_DIRECTORY,
+ OfficeSettings.class,
+ "get" + OfficeSettings.OFFICE_DIRECTORY,
+ "set" + OfficeSettings.OFFICE_DIRECTORY),
+ new PropertyDescriptor(OfficeSettings.WARN_BEFORE_DOC_DEPLOY,
+ OfficeSettings.class,
+ "get" + OfficeSettings.WARN_BEFORE_DOC_DEPLOY,
+ "set" + OfficeSettings.WARN_BEFORE_DOC_DEPLOY),
+ new PropertyDescriptor(OfficeSettings.WARN_BEFORE_PARCEL_DELETE,
+ OfficeSettings.class,
+ "get" + OfficeSettings.WARN_BEFORE_PARCEL_DELETE,
+ "set" + OfficeSettings.WARN_BEFORE_PARCEL_DELETE),
+ new PropertyDescriptor(OfficeSettings.WARN_AFTER_DIR_DEPLOY,
+ OfficeSettings.class,
+ "get" + OfficeSettings.WARN_AFTER_DIR_DEPLOY,
+ "set" + OfficeSettings.WARN_AFTER_DIR_DEPLOY),
+ new PropertyDescriptor(OfficeSettings.WARN_BEFORE_MOUNT,
+ OfficeSettings.class,
+ "get" + OfficeSettings.WARN_BEFORE_MOUNT,
+ "set" + OfficeSettings.WARN_BEFORE_MOUNT)
+ };
+
+ props[0].setDisplayName(NbBundle.getMessage(
+ OfficeSettingsBeanInfo.class, "PROP_OfficeDirectory"));
+ props[0].setShortDescription(NbBundle.getMessage(
+ OfficeSettingsBeanInfo.class, "HINT_OfficeDirectory"));
+ props[0].setPropertyEditorClass(OfficeDirectoryEditor.class);
+
+ props[1].setDisplayName(NbBundle.getMessage(
+ OfficeSettingsBeanInfo.class, "PROP_WarnBeforeDocDeploy"));
+ props[1].setShortDescription(NbBundle.getMessage(
+ OfficeSettingsBeanInfo.class, "HINT_WarnBeforeDocDeploy"));
+ props[1].setHidden(true);
+
+ props[2].setDisplayName(NbBundle.getMessage(
+ OfficeSettingsBeanInfo.class, "PROP_WarnAfterDirDeploy"));
+ props[2].setShortDescription(NbBundle.getMessage(
+ OfficeSettingsBeanInfo.class, "HINT_WarnAfterDirDeploy"));
+ props[2].setHidden(true);
+
+ props[3].setDisplayName(NbBundle.getMessage(
+ OfficeSettingsBeanInfo.class, "PROP_WarnBeforeMount"));
+ props[3].setShortDescription(NbBundle.getMessage(
+ OfficeSettingsBeanInfo.class, "HINT_WarnBeforeMount"));
+ props[3].setHidden(true);
+
+ return props;
+ }
+ catch (IntrospectionException ie) {
+ ErrorManager.getDefault().notify(ie);
+ return null;
+ }
+ }
+
+ public Image getIcon(int type) {
+ if (type == BeanInfo.ICON_COLOR_16x16 || type == BeanInfo.ICON_MONO_16x16) {
+ return Utilities.loadImage("/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon.gif");
+ } else {
+ return Utilities.loadImage("/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon32.gif");
+ }
+ }
+
+ public static class OfficeDirectoryEditor extends PropertyEditorSupport
+ implements ChangeListener {
+
+ private SelectPathPanel panel;
+
+ public String getAsText () {
+ return ((OfficeInstallation)getValue()).getPath();
+ }
+
+ public void setAsText (String path) {
+ OfficeInstallation oi = new OfficeInstallation(path);
+
+ if (!oi.supportsFramework())
+ throw new IllegalArgumentException(path +
+ " is not a valid Office install");
+ else
+ setValue (oi);
+ }
+
+ public Component getCustomEditor() {
+ panel = new SelectPathPanel();
+ panel.addChangeListener(this);
+ return panel.getComponent();
+ }
+
+ public boolean supportsCustomEditor() {
+ return true;
+ }
+
+ public void stateChanged(ChangeEvent evt) {
+ setValue(panel.getSelectedPath());
+ }
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon.gif b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon.gif
new file mode 100644
index 000000000000..9bed8526705b
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon.gif
Binary files differ
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon32.gif b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon32.gif
new file mode 100644
index 000000000000..65bfc82bc25f
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon32.gif
Binary files differ
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/AppStorage.html b/scripting/java/org/openoffice/netbeans/modules/office/resources/AppStorage.html
new file mode 100644
index 000000000000..ee576e74ce61
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/AppStorage.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<HTML>
+ <HEAD>
+ <TITLE></TITLE>
+ </HEAD>
+ <BODY>
+ <P>
+This wizard will let you mount the Office Application scripts directory
+ </BODY>
+</HTML>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/AppStorage.settings b/scripting/java/org/openoffice/netbeans/modules/office/resources/AppStorage.settings
new file mode 100644
index 000000000000..b682273020b3
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/AppStorage.settings
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+ <module name="org.openoffice.netbeans.modules.office/1"/>
+ <instanceof class="org.openide.filesystems.FileSystem"/>
+ <instance class="org.netbeans.core.ExLocalFileSystem"/>
+</settings>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/Bundle.properties b/scripting/java/org/openoffice/netbeans/modules/office/resources/Bundle.properties
new file mode 100644
index 000000000000..22aea6525f3d
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/Bundle.properties
@@ -0,0 +1,24 @@
+# x-no-translate
+Templates/OfficeScripting=Office Scripting
+Templates/OfficeScripting/parcel.xml=Script Parcel Descriptor
+Services/MIMEResolver/org-netbeans-modules-office-mime-resolver.xml=Script Parcel Descriptor File
+Templates=Templates
+Templates/OfficeScripting/HelloWorld=Hello World Example Script
+
+Templates/Mount/org-openoffice-netbeans-modules-office-resources-AppStorage.settings=Office Application Scripts
+Templates/Mount/org-openoffice-netbeans-modules-office-resources-OpenOfficeDocFileSystem.settings=OpenOffice.org document
+
+UI/Services/IDEConfiguration/ServerAndExternalToolSettings/org-openoffice-netbeans-modules-office-options-OfficeSettings.instance=Office Settings
+
+Services/org-openoffice-netbeans-modules-office-resources-OfficeSettings.settings=Office Settings
+
+PROP_OfficeDirectory=Office Installation Directory
+
+HINT_OfficeDirectory=Path to directory where Office is installed
+
+Templates/OfficeScripting/Parcel=Parcel Recipe
+Templates/OfficeScripting/EmptyScript=Empty Script
+Templates/OfficeScripting/EmptyScript/Empty.java=Java
+Templates/OfficeScripting/EmptyScript/Empty.bsh=BeanShell
+
+Menu/Help/office-scripting.url=&Office Scripting Framework Site
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/EmptyParcel.html b/scripting/java/org/openoffice/netbeans/modules/office/resources/EmptyParcel.html
new file mode 100644
index 000000000000..f3c478c42aa3
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/EmptyParcel.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<HTML>
+ <HEAD>
+ <TITLE></TITLE>
+ </HEAD>
+ <BODY>
+ <P>
+This allows you to create an Empty Office Script.
+ </BODY>
+</HTML>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon.gif b/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon.gif
new file mode 100644
index 000000000000..ec7507ef9e54
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon.gif
Binary files differ
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon32.gif b/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon32.gif
new file mode 100644
index 000000000000..94fdab1eba0c
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon32.gif
Binary files differ
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeSettings.settings b/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeSettings.settings
new file mode 100644
index 000000000000..df98da11659b
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeSettings.settings
@@ -0,0 +1,9 @@
+<?xml version="1.0"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+ <module name="org.openoffice.netbeans.modules.office"/>
+ <instanceof class="org.openide.util.SharedClassObject"/>
+ <instanceof class="org.openide.util.SystemOption"/>
+ <instanceof class="org.openoffice.netbeans.modules.office.options.OfficeSettings"/>
+ <instance class="org.openoffice.netbeans.modules.office.options.OfficeSettings"/>
+</settings>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystem.html b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystem.html
new file mode 100644
index 000000000000..5a879388bb28
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystem.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<HTML>
+ <HEAD>
+ <TITLE></TITLE>
+ </HEAD>
+ <BODY>
+ <P>
+This allows you to mount OpenOffice.org document.
+ </BODY>
+</HTML>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystem.settings b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystem.settings
new file mode 100644
index 000000000000..32a5bd490be1
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystem.settings
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<!DOCTYPE settings PUBLIC "-//NetBeans//DTD Session settings 1.0//EN" "http://www.netbeans.org/dtds/sessionsettings-1_0.dtd">
+<settings version="1.0">
+ <module name="org.openoffice.netbeans.modules.office/1"/>
+ <instanceof class="org.openide.filesystems.FileSystem"/>
+ <instance class="org.openoffice.netbeans.modules.office.filesystem.OpenOfficeDocFileSystem"/>
+</settings>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon.png b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon.png
new file mode 100644
index 000000000000..a441019346f9
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon.png
Binary files differ
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon32.png b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon32.png
new file mode 100644
index 000000000000..1b2ee21e6d9c
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon32.png
Binary files differ
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/ParcelIcon.gif b/scripting/java/org/openoffice/netbeans/modules/office/resources/ParcelIcon.gif
new file mode 100644
index 000000000000..a889c2614edf
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/ParcelIcon.gif
Binary files differ
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/ScriptParcel.html b/scripting/java/org/openoffice/netbeans/modules/office/resources/ScriptParcel.html
new file mode 100644
index 000000000000..c0f489032b9c
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/ScriptParcel.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<HTML>
+ <HEAD>
+ <TITLE></TITLE>
+ </HEAD>
+ <BODY>
+ <P>
+This allows you to create a Hello World example Office Script.
+ </BODY>
+</HTML>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/ScriptParcelDescriptor.html b/scripting/java/org/openoffice/netbeans/modules/office/resources/ScriptParcelDescriptor.html
new file mode 100644
index 000000000000..d753d5dfe926
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/ScriptParcelDescriptor.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+
+<HTML>
+ <HEAD>
+ <TITLE></TITLE>
+ </HEAD>
+ <BODY>
+ <P>
+This allows you to create a Office Script Parcel Descriptor File.
+ </BODY>
+</HTML>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/layer.xml b/scripting/java/org/openoffice/netbeans/modules/office/resources/layer.xml
new file mode 100644
index 000000000000..86b834d0d065
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/layer.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.1//EN" "http://www.netbeans.org/dtds/filesystem-1_1.dtd">
+<filesystem>
+ <folder name="Templates">
+ <attr name="SystemFileSystem.localizingBundle" stringvalue="org.openoffice.netbeans.modules.office.resources.Bundle"/>
+
+ <folder name="OfficeScripting">
+ <attr name="SystemFileSystem.localizingBundle" stringvalue="org.openoffice.netbeans.modules.office.resources.Bundle"/>
+ <folder name="Parcel">
+ <attr boolvalue="true" name="template"/>
+ <attr name="SystemFileSystem.localizingBundle" stringvalue="org.openoffice.netbeans.modules.office.resources.Bundle"/>
+ <attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/openoffice/netbeans/modules/office/resources/OfficeIcon.gif"/>
+ <attr name="templateWizardURL" urlvalue="nbresloc:/org/openoffice/netbeans/modules/office/resources/EmptyParcel.html"/>
+ <attr name="templateWizardIterator" newvalue="org.openoffice.netbeans.modules.office.wizard.ParcelContentsIterator"/>
+ <folder name="Contents">
+ <file name="parcel-descriptor.xml" url="templates/EmptyParcelDescriptor.xml_"/>
+ <!-- file name="Empty.java" url="templates/Empty.java_"/ -->
+ </folder>
+ </folder>
+ <folder name="EmptyScript">
+ <attr name="SystemFileSystem.localizingBundle" stringvalue="org.openoffice.netbeans.modules.office.resources.Bundle"/>
+ <file name="Empty.java" url="templates/Empty.java_">
+ <attr name="template" boolvalue="true"/>
+ <attr name="SystemFileSystem.localizingBundle" stringvalue="org.openoffice.netbeans.modules.office.resources.Bundle"/>
+ <attr name="templateWizardIterator" newvalue="org.openoffice.netbeans.modules.office.wizard.JavaScriptIterator"/>
+ </file>
+ <file name="Empty.bsh" url="templates/Empty.bsh_">
+ <attr name="template" boolvalue="true"/>
+ <attr name="SystemFileSystem.localizingBundle" stringvalue="org.openoffice.netbeans.modules.office.resources.Bundle"/>
+ </file>
+ </folder>
+ </folder>
+ <attr boolvalue="true" name="Ant/OfficeScripting"/>
+ <attr boolvalue="true" name="OfficeScripting/Other"/>
+
+ <!-- OpenOfficeDoc FileSystem BEGIN: -->
+ <!-- Uncomment to enable writable mounting of Office Documents
+ <folder name="Mount">
+ <attr name="org-netbeans-core-ExLocalFileSystem.settings/org-openoffice-netbeans-modules-office-resources-OpenOfficeDocFileSystem.settings"
+ boolvalue="true"/>
+ <attr name="org-openoffice-netbeans-modules-office-resources-OpenOfficeDocFileSystem.settings/VCS"
+ boolvalue="true"/>
+
+ <file name="org-openoffice-netbeans-modules-office-resources-OpenOfficeDocFileSystem.settings"
+ url="OpenOfficeDocFileSystem.settings">
+ <attr name="template"
+ boolvalue="true"/>
+ <attr name="SystemFileSystem.localizingBundle"
+ stringvalue="org.openoffice.netbeans.modules.office.resources.Bundle"/>
+ <attr name="SystemFileSystem.icon"
+ urlvalue="nbresloc:/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon.png"/>
+ <attr name="templateWizardIterator"
+ methodvalue="org.netbeans.core.ui.MountNode.iterator"/>
+ <attr name="templateWizardURL"
+ urlvalue="nbresloc:/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystem.html"/>
+ </file>
+ </folder>
+ -->
+ <!-- OpenOfficeDoc FileSystem END: -->
+ </folder>
+
+ <folder name="Services">
+ <folder name="MIMEResolver">
+ <file name="org-netbeans-modules-office-mime-resolver.xml" url="mime-resolver.xml">
+ <attr name="SystemFileSystem.localizingBundle" stringvalue="org.openoffice.netbeans.modules.office.resources.Bundle"/>
+ <attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/openoffice/netbeans/modules/office/resources/OfficeIcon.gif"/>
+ </file>
+ </folder>
+ <file name="org-openoffice-netbeans-modules-office-resources-OfficeSettings.settings" url="OfficeSettings.settings">
+ <attr name="SystemFileSystem.localizingBundle" stringvalue="org.openoffice.netbeans.modules.office.resources.Bundle"/>
+ <attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/openoffice/netbeans/modules/office/resources/OfficeIcon.gif"/>
+ </file>
+ </folder>
+
+ <folder name="Menu">
+ <folder name="Help">
+ <attr name="submit-feedback-link.url/office-scripting.url" boolvalue="true"/>
+ <file name="office-scripting.url" url="office-scripting.url">
+ <attr name="SystemFileSystem.localizingBundle" stringvalue="org.openoffice.netbeans.modules.office.resources.Bundle"/>
+ <attr name="SystemFileSystem.icon" urlvalue="nbresloc:/org/openoffice/netbeans/modules/office/resources/webLink.gif"/>
+ </file>
+ </folder>
+ </folder>
+
+ <folder name="UI">
+ <folder name="Services">
+ <folder name="IDEConfiguration">
+ <folder name="ServerAndExternalToolSettings">
+ <file name="org-openoffice-netbeans-modules-office-resources-OfficeSettings.shadow">
+ <attr name="originalFile" stringvalue="Services/org-openoffice-netbeans-modules-office-resources-OfficeSettings.settings"/>
+ </file>
+ </folder>
+ </folder>
+ </folder>
+ </folder>
+
+ <attr boolvalue="true" name="Templates/Services"/>
+</filesystem>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/mime-resolver.xml b/scripting/java/org/openoffice/netbeans/modules/office/resources/mime-resolver.xml
new file mode 100644
index 000000000000..3e0f3053a81e
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/mime-resolver.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE MIME-resolver PUBLIC "-//NetBeans//DTD MIME Resolver 1.0//EN" "http://www.netbeans.org/dtds/mime-resolver-1_0.dtd">
+
+<MIME-resolver>
+
+ <!-- Resolve according to root element: -->
+ <file>
+ <ext name="xml"/>
+ <resolver mime="text/x-parcel+xml">
+ <xml-rule>
+ <element name="parcel"/>
+ </xml-rule>
+ </resolver>
+ </file>
+
+</MIME-resolver>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/office-scripting.url b/scripting/java/org/openoffice/netbeans/modules/office/resources/office-scripting.url
new file mode 100644
index 000000000000..f7be83c0eae4
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/office-scripting.url
@@ -0,0 +1 @@
+http://framework.openoffice.org/scripting/netbeans-devguide.html
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/Empty.bsh_ b/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/Empty.bsh_
new file mode 100644
index 000000000000..9354dba121b6
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/Empty.bsh_
@@ -0,0 +1,24 @@
+// If using XComponentContext need to uncomment import directive below:
+// import com.sun.star.uno.XComponentContext;
+
+// If using XDesktop need to uncomment import directive below:
+// import com.sun.star.frame.XDesktop;
+
+// If using XComponent need to uncomment import directive below:
+// import com.sun.star.frame.XModel;
+
+import drafts.com.sun.star.script.framework.runtime.XScriptContext;
+
+/* Use the XScriptContext variable "context" to access the document for
+ which this script was invoked. This variable will be initialised
+ automatically by the Scripting Framework when the script is invoked.
+
+ Methods available are:
+
+ context.getDocument() returns XModel
+ context.getDesktop() returns XDesktop
+ context.getComponentContext() returns XComponentContext
+*/
+
+// Uncomment to get the current document model
+// xmodel = context.getDocument();
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/Empty.java_ b/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/Empty.java_
new file mode 100644
index 000000000000..cf997b0f1082
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/Empty.java_
@@ -0,0 +1,27 @@
+// If using XComponentContext need to uncomment import directive below:
+// import com.sun.star.uno.XComponentContext;
+
+// If using XDesktop need to uncomment import directive below:
+// import com.sun.star.frame.XDesktop;
+
+// If using XComponent need to uncomment import directive below:
+// import com.sun.star.frame.XModel;
+
+import drafts.com.sun.star.script.framework.runtime.XScriptContext;
+
+public class Empty {
+
+ public void doMethod(XScriptContext xSc) {
+
+ /* Methods available from XScriptContext:
+ xSc.getDocument() returns XModel
+ xSc.getDesktop() returns XDesktop
+ xSc.getComponentContext() returns XComponentContext
+ */
+
+ // Uncomment to get the current document as a component
+ // XComponent xcomponent = xSc.getDocument();
+
+ }
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/EmptyParcelDescriptor.xml_ b/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/EmptyParcelDescriptor.xml_
new file mode 100644
index 000000000000..7c016c322e0a
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/EmptyParcelDescriptor.xml_
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<parcel language="Java" xmlns:parcel="scripting.dtd">
+</parcel>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/HelloWorld.java_ b/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/HelloWorld.java_
new file mode 100644
index 000000000000..36e66aeeb20e
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/HelloWorld.java_
@@ -0,0 +1,41 @@
+// If using XMultiServiceFactory need to uncomment import directive below:
+//import com.sun.star.lang.XMultiServiceFactory;
+
+// If using XDesktop need to uncomment import directive below:
+//import com.sun.star.frame.XDesktop;
+
+import com.sun.star.uno.UnoRuntime;
+import com.sun.star.lang.*;
+import com.sun.star.text.*;
+
+import drafts.com.sun.star.script.framework.runtime.XScriptContext;
+
+
+public class HelloWorld {
+
+ public void printHello(XScriptContext xSc) {
+
+ /* Methods available from XScriptContext:
+ xSc.getDocument() returns XModel
+ xSc.getDesktop() returns XDesktop
+ xSc.getMultiComponentFactory() returns XMultiComponentFactory
+ */
+
+ // Getting the current document as a component
+ XComponent xcomponent = xSc.getDocument();
+
+ // Getting the text document object
+ XTextDocument xtextdocument = (XTextDocument) UnoRuntime.queryInterface(
+XTextDocument.class, xcomponent);
+
+ //Getting the text object
+ XText oText = xtextdocument.getText();
+
+ //Create a cursor object
+ XTextCursor oCursor = oText.createTextCursor();
+
+ // Print out Hello World
+ oText.insertString( oCursor, "**** HELLO ****", false );
+ }
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/ParcelDescriptor.xml_ b/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/ParcelDescriptor.xml_
new file mode 100644
index 000000000000..81ffce04e37d
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/templates/ParcelDescriptor.xml_
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<parcel>
+ <script language="Java" deploymentdir="java/HelloWorld">
+ <logicalname value="HelloWorld.printHello"/>
+ <languagename value="HelloWorld.printHello" location="HelloWorld.class"/>
+ </script>
+</parcel>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/webLink.gif b/scripting/java/org/openoffice/netbeans/modules/office/resources/webLink.gif
new file mode 100755
index 000000000000..ae40f9af595f
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/webLink.gif
Binary files differ
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/utils/FrameworkJarChecker.java b/scripting/java/org/openoffice/netbeans/modules/office/utils/FrameworkJarChecker.java
new file mode 100644
index 000000000000..a9ac1b4bdaa9
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/FrameworkJarChecker.java
@@ -0,0 +1,140 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.utils;
+
+import java.io.File;
+import java.io.IOException;
+import java.beans.PropertyVetoException;
+
+import org.openide.filesystems.Repository;
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.JarFileSystem;
+
+import org.openoffice.idesupport.SVersionRCFile;
+import org.openoffice.netbeans.modules.office.options.OfficeSettings;
+
+public class FrameworkJarChecker {
+
+ public static void mountDependencies() {
+ String unoilPath = SVersionRCFile.getPathForUnoil(
+ OfficeSettings.getDefault().getOfficeDirectory().getPath());
+
+ if (unoilPath == null)
+ return;
+
+ File unoilFile = new File(unoilPath + File.separator + "unoil.jar");
+ JarFileSystem jfs = new JarFileSystem();
+ try {
+ jfs.setJarFile(unoilFile);
+ }
+ catch (IOException ioe) {
+ return;
+ }
+ catch (PropertyVetoException pve) {
+ return;
+ }
+
+ FileSystem result;
+ try {
+ result =
+ Repository.getDefault().findFileSystem(jfs.getSystemName());
+ }
+ catch(Exception exp) {
+ result = null;
+ }
+ finally {
+ jfs.removeNotify();
+ }
+
+ if(result == null) {
+ // warnBeforeMount();
+ JarFileSystem newjfs = new JarFileSystem();
+ try {
+ newjfs.setJarFile(unoilFile);
+ }
+ catch (IOException ioe) {
+ return;
+ }
+ catch (PropertyVetoException pve) {
+ return;
+ }
+ Repository.getDefault().addFileSystem(newjfs);
+ newjfs.setHidden(true);
+ }
+ }
+
+ public static void unmountDependencies() {
+ String unoilPath = SVersionRCFile.getPathForUnoil(
+ OfficeSettings.getDefault().getOfficeDirectory().getPath());
+
+ if (unoilPath == null)
+ return;
+
+ File unoilFile = new File(unoilPath + File.separator + "unoil.jar");
+ JarFileSystem jfs = new JarFileSystem();
+ try {
+ jfs.setJarFile(unoilFile);
+ }
+ catch (IOException ioe) {
+ return;
+ }
+ catch (PropertyVetoException pve) {
+ return;
+ }
+
+ FileSystem result;
+ try {
+ result =
+ Repository.getDefault().findFileSystem(jfs.getSystemName());
+ if(result != null)
+ Repository.getDefault().removeFileSystem(result);
+ }
+ catch(Exception exp) {
+ }
+ }
+
+ private static void warnBeforeMount() {
+ OfficeSettings settings = OfficeSettings.getDefault();
+
+ if (settings.getWarnBeforeMount() == false)
+ return;
+
+ String message = "The Office Scripting Framework support jar file " +
+ "is not mounted, so Office scripts will not compile. NetBeans " +
+ "is going to mount this jar file automatically.";
+
+ String prompt = "Show this message in future.";
+
+ NagDialog warning = NagDialog.createInformationDialog(
+ message, prompt, true);
+
+ if (warning.getState() == false) {
+ settings.setWarnBeforeMount(false);
+ }
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/utils/ManifestParser.java b/scripting/java/org/openoffice/netbeans/modules/office/utils/ManifestParser.java
new file mode 100644
index 000000000000..b15d4b270027
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/ManifestParser.java
@@ -0,0 +1,97 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.utils;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.io.IOException;
+import java.io.File;
+
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+import org.openide.xml.XMLUtil;
+
+import com.sun.star.script.framework.container.XMLParser;
+import org.openoffice.netbeans.modules.office.options.OfficeSettings;
+import org.openoffice.idesupport.OfficeInstallation;
+
+public class ManifestParser implements XMLParser {
+
+ private static ManifestParser parser = null;
+
+ private ManifestParser() {
+ }
+
+ public static ManifestParser getManifestParser() {
+ if (parser == null) {
+ synchronized(ManifestParser.class) {
+ if (parser == null)
+ parser = new ManifestParser();
+ }
+ }
+ return parser;
+ }
+
+ public Document parse(InputStream inputStream) {
+ InputSource is;
+ Document result = null;
+
+ try {
+ OfficeInstallation oi = OfficeSettings.getDefault().getOfficeDirectory();
+ String id = oi.getURL("share/dtd/officedocument/1_0/");
+
+ is = new InputSource(inputStream);
+ is.setSystemId(id);
+
+ result = XMLUtil.parse(is, false, false, null, null);
+ }
+ catch (IOException ioe) {
+ System.out.println("IO Error parsing stream.");
+ return null;
+ }
+ catch (SAXParseException spe) {
+ System.out.println("Sax Error parsing stream: " + spe.getMessage());
+ System.out.println("\tPublicId: " + spe.getPublicId());
+ System.out.println("\tSystemId: " + spe.getSystemId());
+ return null;
+ }
+ catch (SAXException se) {
+ System.out.println("Sax Error parsing stream: " + se.getMessage());
+ return null;
+ }
+
+ return result;
+ }
+
+ public void write(Document doc, OutputStream out) throws IOException {
+ XMLUtil.write(doc, out, "");
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/utils/NagDialog.java b/scripting/java/org/openoffice/netbeans/modules/office/utils/NagDialog.java
new file mode 100644
index 000000000000..05bd8ee966a4
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/NagDialog.java
@@ -0,0 +1,127 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.utils;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+
+import javax.swing.JPanel;
+import javax.swing.JOptionPane;
+import javax.swing.JCheckBox;
+import javax.swing.border.EmptyBorder;
+
+import org.openide.TopManager;
+import org.openide.NotifyDescriptor;
+
+public class NagDialog {
+
+ private NotifyDescriptor descriptor;
+ private JPanel panel;
+ private JCheckBox checkbox;
+
+ private NagDialog(String message, String prompt, boolean initialState,
+ int type) {
+ initUI(message, prompt, initialState, type);
+ }
+
+ public static NagDialog createInformationDialog(
+ String message, String prompt, boolean initialState) {
+ NagDialog result = new NagDialog(
+ message, prompt, initialState, JOptionPane.INFORMATION_MESSAGE);
+
+ result.setDescriptor(new NotifyDescriptor.Message(result.getPanel(),
+ NotifyDescriptor.PLAIN_MESSAGE));
+
+ return result;
+ }
+
+ public static NagDialog createConfirmationDialog(
+ String message, String prompt, boolean initialState) {
+ NagDialog result = new NagDialog(
+ message, prompt, initialState, JOptionPane.QUESTION_MESSAGE);
+
+ result.setDescriptor(new NotifyDescriptor.Confirmation(
+ result.getPanel(), NotifyDescriptor.OK_CANCEL_OPTION,
+ NotifyDescriptor.PLAIN_MESSAGE));
+
+ return result;
+ }
+
+ public boolean show() {
+ TopManager.getDefault().notify(descriptor);
+
+ if (descriptor.getValue() == NotifyDescriptor.OK_OPTION)
+ return true;
+ else
+ return false;
+ }
+
+ public boolean getState() {
+ return checkbox.isSelected();
+ }
+
+ private JPanel getPanel() {
+ return this.panel;
+ }
+
+ private void setDescriptor(NotifyDescriptor descriptor) {
+ this.descriptor = descriptor;
+ }
+
+ private void initUI(String message, String prompt, boolean initialState,
+ int type) {
+
+ this.panel = new JPanel();
+ JOptionPane optionPane = new JOptionPane(message, type, 0, null,
+ new Object[0], null)
+ {
+ public int getMaxCharactersPerLineCount() {
+ return 100;
+ }
+ };
+ optionPane.setUI(new javax.swing.plaf.basic.BasicOptionPaneUI() {
+ public Dimension getMinimumOptionPaneSize() {
+ if (minimumSize == null) {
+ return new Dimension(MinimumWidth, 50);
+ }
+ return new Dimension(minimumSize.width, 50);
+ }
+ });
+ optionPane.setWantsInput(false);
+
+ JPanel checkPanel = new JPanel();
+ checkbox = new JCheckBox(prompt, initialState);
+ checkPanel.setLayout(new BorderLayout());
+ checkPanel.setBorder(new EmptyBorder(0, 20, 0, 0));
+ checkPanel.add(checkbox, BorderLayout.WEST);
+
+ this.panel.setLayout(new BorderLayout());
+ this.panel.add(optionPane, BorderLayout.CENTER);
+ this.panel.add(checkPanel, BorderLayout.SOUTH);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/utils/OfficeModule.java b/scripting/java/org/openoffice/netbeans/modules/office/utils/OfficeModule.java
new file mode 100644
index 000000000000..8cf16eb08a82
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/OfficeModule.java
@@ -0,0 +1,68 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.utils;
+
+import org.openide.TopManager;
+import org.openide.WizardDescriptor;
+import org.openide.NotifyDescriptor;
+import org.openide.modules.ModuleInstall;
+
+import com.sun.star.script.framework.container.XMLParserFactory;
+import org.openoffice.idesupport.OfficeInstallation;
+import org.openoffice.netbeans.modules.office.wizard.InstallationPathDescriptor;
+import org.openoffice.netbeans.modules.office.options.OfficeSettings;
+
+public class OfficeModule extends ModuleInstall {
+
+ private static final long serialVersionUID = -8499324854301243852L;
+
+ public void installed () {
+ WizardDescriptor wiz = new InstallationPathDescriptor();
+ TopManager.getDefault().createDialog(wiz).show();
+
+ if(wiz.getValue() == NotifyDescriptor.OK_OPTION) {
+ OfficeInstallation oi = (OfficeInstallation)
+ wiz.getProperty(InstallationPathDescriptor.PROP_INSTALLPATH);
+
+ OfficeSettings settings = OfficeSettings.getDefault();
+ settings.setOfficeDirectory(oi);
+ }
+ FrameworkJarChecker.mountDependencies();
+ XMLParserFactory.setParser(ManifestParser.getManifestParser());
+ }
+
+ public void restored () {
+ FrameworkJarChecker.mountDependencies();
+ XMLParserFactory.setParser(ManifestParser.getManifestParser());
+ }
+
+ public boolean closing () {
+ FrameworkJarChecker.unmountDependencies();
+ return true;
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/utils/PackageRemover.java b/scripting/java/org/openoffice/netbeans/modules/office/utils/PackageRemover.java
new file mode 100644
index 000000000000..07c2c939372f
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/PackageRemover.java
@@ -0,0 +1,106 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.utils;
+
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+
+import org.openoffice.idesupport.zip.ParcelZipper;
+
+public class PackageRemover {
+ private PackageRemover() {
+ }
+
+ public static void removeDeclaration(File source) throws IOException {
+ File tmp = new File(source.getAbsolutePath() + ".tmp");
+
+ BufferedReader in = new BufferedReader(new FileReader(source));
+ BufferedWriter out = new BufferedWriter(new FileWriter(tmp));
+
+ try {
+ String line;
+ while ((line = in.readLine()) != null) {
+ if (line.startsWith("package")) {
+ String newDeclaration = evaluate(line);
+ if (newDeclaration != null) {
+ out.write(newDeclaration, 0, newDeclaration.length());
+ out.newLine();
+ }
+ }
+ else {
+ out.write(line, 0, line.length());
+ out.newLine();
+ }
+ }
+ }
+ finally {
+ if (in != null) {
+ in.close();
+ }
+ if (out != null) {
+ out.close();
+ }
+ }
+
+ if (source.delete() == false) {
+ tmp.delete();
+ throw new IOException("Could not overwrite " + source);
+ }
+ else {
+ tmp.renameTo(source);
+ }
+ }
+
+ public static String evaluate(String line) {
+
+ int idx = line.indexOf(ParcelZipper.CONTENTS_DIRNAME);
+ if (idx == -1)
+ return line;
+
+ idx = idx + ParcelZipper.CONTENTS_DIRNAME.length();
+ if (line.charAt(idx) == '.')
+ return "package " + line.substring(idx + 1);;
+
+ return null;
+ }
+
+ public static void main(String[] args) {
+ File source = new File(args[0]);
+
+ try {
+ removeDeclaration(source);
+ }
+ catch (IOException ioe) {
+ ioe.printStackTrace();
+ }
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/utils/ZipMounter.java b/scripting/java/org/openoffice/netbeans/modules/office/utils/ZipMounter.java
new file mode 100644
index 000000000000..8616bfaefdb2
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/ZipMounter.java
@@ -0,0 +1,92 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.utils;
+
+import java.io.*;
+import java.util.zip.*;
+import java.beans.PropertyVetoException;
+
+import org.openide.filesystems.FileSystem;
+import org.openide.filesystems.Repository;
+
+import org.openoffice.netbeans.modules.office.filesystem.OpenOfficeDocFileSystem;
+
+public class ZipMounter
+{
+ private static ZipMounter mounter = null;
+
+ private ZipMounter() {
+ }
+
+ public static ZipMounter getZipMounter() {
+ if (mounter == null) {
+ synchronized(ZipMounter.class) {
+ if (mounter == null)
+ mounter = new ZipMounter();
+ }
+ }
+ return mounter;
+ }
+
+ public void mountZipFile(File zipfile)
+ throws IOException, PropertyVetoException
+ {
+ if (zipfile != null) {
+ addDocumentToRepository(zipfile, true);
+ }
+ }
+
+ private FileSystem addDocumentToRepository(File rootFile, boolean writeable)
+ throws IOException, PropertyVetoException
+ {
+ Repository repo = Repository.getDefault();
+ OpenOfficeDocFileSystem oofs;
+ oofs = (OpenOfficeDocFileSystem)getMountedDocument(rootFile);
+ if(oofs != null)
+ repo.removeFileSystem(oofs);
+ oofs = new OpenOfficeDocFileSystem();
+ oofs.setDocument(rootFile);
+ repo.addFileSystem(oofs);
+ return oofs;
+ }
+
+ /** @return FileSystem which has given jar file as its root or
+ * null if no such file system could be found in repository */
+ private FileSystem getMountedDocument(File rootFile)
+ {
+ if (rootFile == null)
+ return null;
+ FileSystem oofs = null;
+ try {
+ oofs = Repository.getDefault().findFileSystem(
+ OpenOfficeDocFileSystem.computeSystemName(rootFile));
+ } catch(Exception exp) {
+ }
+ return oofs;
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/Bundle.properties b/scripting/java/org/openoffice/netbeans/modules/office/wizard/Bundle.properties
new file mode 100644
index 000000000000..a40b4b373959
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/Bundle.properties
@@ -0,0 +1,27 @@
+# Window System API
+# x-no-translate
+
+# TopComponent
+LBL_component_name=<name of component>
+#LBL_mode_name=<name of mode>
+#LBL_workspace_name=<name of workspace>
+
+# WizardDescriptor
+# Dialog title:
+TITLE_wizard=Select Path to OpenOffice.org Installation
+
+# WizardDescriptor.Iterator
+# Label the sequence #. Appears at top of pane:
+# e.g. "Panel Name (1 of 3)"
+TITLE_x_of_y={0} of {1}
+# Provide list of steps to show in left pane:
+#LBL_step_1=Select First Thing
+#LBL_step_2=Configure Details
+
+# WizardDescriptor.Panel
+# Will appear in dialog title; see above
+TITLE_ParcelPropertiesVisualPanel=Parcel Recipe Properties
+TITLE_SelectPathVisualPanel=Path to OpenOffice.org
+
+# CallableSystemAction
+LBL_Action=Run Action
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/Bundle_en_US.properties b/scripting/java/org/openoffice/netbeans/modules/office/wizard/Bundle_en_US.properties
new file mode 100644
index 000000000000..e69de29bb2d1
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/Bundle_en_US.properties
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/InstallationPathDescriptor.java b/scripting/java/org/openoffice/netbeans/modules/office/wizard/InstallationPathDescriptor.java
new file mode 100644
index 000000000000..f7c057cf48b3
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/InstallationPathDescriptor.java
@@ -0,0 +1,72 @@
+/*
+ * InstallationPathDescriptor.java
+ *
+ * Created on February 12, 2003
+ */
+
+package org.openoffice.netbeans.modules.office.wizard;
+
+import java.awt.Dimension;
+import java.awt.Toolkit;
+import java.net.URL;
+import java.net.MalformedURLException;
+
+import org.openide.TopManager;
+import org.openide.WizardDescriptor;
+import org.openide.util.NbBundle;
+
+/** A wizard descriptor.
+ *
+ * @author tomaso
+ */
+public class InstallationPathDescriptor extends WizardDescriptor {
+
+ private final InstallationPathIterator iterator;
+ public static final String PROP_INSTALLPATH = "INSTALLPATH";
+
+ /** Make a descriptor suited to use InstallationPathIterator.
+ * Sets up various wizard properties to follow recommended
+ * style guidelines.
+ */
+ public InstallationPathDescriptor() {
+ this(new InstallationPathIterator());
+ }
+ private InstallationPathDescriptor(InstallationPathIterator iterator) {
+ super(iterator);
+ this.iterator = iterator;
+ // Set title for the dialog:
+ setTitle(NbBundle.getMessage(InstallationPathDescriptor.class, "TITLE_wizard"));
+ // Make the left pane appear:
+ putProperty("WizardPanel_autoWizardStyle", Boolean.TRUE); // NOI18N
+ // Make the left pane show list of steps etc.:
+ putProperty("WizardPanel_contentDisplayed", Boolean.TRUE); // NOI18N
+ // Number the steps.
+ // putProperty("WizardPanel_contentNumbered", Boolean.TRUE); // NOI18N
+ /*
+ // Optional: make nonmodal.
+ setModal(false);
+ // (If you make the wizard nonmodal, you will call it differently;
+ // see InstallationPathAction for instructions.)
+ // Optional: show a help tab with special info about the pane:
+ putProperty("WizardPanel_helpDisplayed", Boolean.TRUE); // NOI18N
+ // Optional: set the size of the left pane explicitly:
+ putProperty("WizardPanel_leftDimension", new Dimension(100, 400)); // NOI18N
+ // Optional: if you want a special background image for the left pane:
+ try {
+ putProperty("WizardPanel_image", // NOI18N
+ Toolkit.getDefaultToolkit().getImage
+ (new URL("nbresloc:/org/openoffice/netbeans/modules/office/wizard/InstallationPathImage.gif"))); // NOI18N
+ } catch (MalformedURLException mfue) {
+ throw new IllegalStateException(mfue.toString());
+ }
+ */
+ }
+
+ // Called when user moves forward or backward etc.:
+ protected void updateState() {
+ super.updateState();
+ putProperty("WizardPanel_contentData", iterator.getSteps()); // NOI18N
+ putProperty("WizardPanel_contentSelectedIndex", new Integer(iterator.getIndex())); // NOI18N
+ }
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/InstallationPathIterator.java b/scripting/java/org/openoffice/netbeans/modules/office/wizard/InstallationPathIterator.java
new file mode 100644
index 000000000000..323175d4c5b8
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/InstallationPathIterator.java
@@ -0,0 +1,136 @@
+/*
+ * InstallationPathIterator.java
+ *
+ * Created on February 12, 2003
+ */
+
+package org.openoffice.netbeans.modules.office.wizard;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openide.WizardDescriptor;
+import org.openide.util.NbBundle;
+
+/** A wizard iterator (sequence of panels).
+ * Used to create a wizard. Create one or more
+ * panels from template as needed too.
+ *
+ * @author tomaso
+ */
+public class InstallationPathIterator implements WizardDescriptor.Iterator {
+
+ // You should define what panels you want to use here:
+
+ protected WizardDescriptor.Panel[] createPanels() {
+ return new WizardDescriptor.Panel[] {
+ new SelectPathPanel()
+ };
+ }
+
+ // And the list of step names:
+
+ protected String[] createSteps() {
+ return new String[] {
+ "Select OpenOffice.org Installation"
+ };
+ }
+
+ // --- The rest probably does not need to be touched. ---
+
+ // Keep track of the panels and selected panel:
+
+ private transient int index = 0;
+ // Also package-accessible to descriptor:
+ protected final int getIndex() {
+ return index;
+ }
+ private transient WizardDescriptor.Panel[] panels = null;
+ protected final WizardDescriptor.Panel[] getPanels() {
+ if (panels == null) {
+ panels = createPanels();
+ }
+ return panels;
+ }
+
+ // Also the list of steps in the left pane:
+
+ private transient String[] steps = null;
+ // Also package-accessible to descriptor:
+ protected final String[] getSteps() {
+ if (steps == null) {
+ steps = createSteps();
+ }
+ return steps;
+ }
+
+ // --- WizardDescriptor.Iterator METHODS: ---
+ // Note that this is very similar to WizardDescriptor.Iterator, but with a
+ // few more options for customization. If you e.g. want to make panels appear
+ // or disappear dynamically, go ahead.
+
+ public String name() {
+ return NbBundle.getMessage(InstallationPathIterator.class, "TITLE_x_of_y",
+ new Integer(index + 1), new Integer(getPanels().length));
+ }
+
+ public boolean hasNext() {
+ return index < getPanels().length - 1;
+ }
+ public boolean hasPrevious() {
+ return index > 0;
+ }
+ public void nextPanel() {
+ if (!hasNext()) throw new NoSuchElementException();
+ index++;
+ }
+ public void previousPanel() {
+ if (!hasPrevious()) throw new NoSuchElementException();
+ index--;
+ }
+ public WizardDescriptor.Panel current() {
+ return getPanels()[index];
+ }
+
+ // If nothing unusual changes in the middle of the wizard, simply:
+ public final void addChangeListener(ChangeListener l) {}
+ public final void removeChangeListener(ChangeListener l) {}
+ // If something changes dynamically (besides moving between panels),
+ // e.g. the number of panels changes in response to user input, then
+ // uncomment the following and call when needed:
+ // fireChangeEvent();
+ /*
+ private transient Set listeners = new HashSet(1); // Set<ChangeListener>
+ public final void addChangeListener(ChangeListener l) {
+ synchronized (listeners) {
+ listeners.add(l);
+ }
+ }
+ public final void removeChangeListener(ChangeListener l) {
+ synchronized (listeners) {
+ listeners.remove(l);
+ }
+ }
+ protected final void fireChangeEvent() {
+ Iterator it;
+ synchronized (listeners) {
+ it = new HashSet(listeners).iterator();
+ }
+ ChangeEvent ev = new ChangeEvent(this);
+ while (it.hasNext()) {
+ ((ChangeListener)it.next()).stateChanged(ev);
+ }
+ }
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ in.defaultReadObject();
+ listeners = new HashSet(1);
+ }
+ */
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/JavaScriptIterator.java b/scripting/java/org/openoffice/netbeans/modules/office/wizard/JavaScriptIterator.java
new file mode 100644
index 000000000000..65f6b0684000
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/JavaScriptIterator.java
@@ -0,0 +1,250 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.wizard;
+
+import java.awt.Component;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import javax.swing.JComponent;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openide.ErrorManager;
+import org.openide.TopManager;
+import org.openide.NotifyDescriptor;
+import org.openide.WizardDescriptor;
+import org.openide.cookies.OpenCookie;
+import org.openide.cookies.SourceCookie;
+import org.openide.loaders.*;
+import org.openide.util.NbBundle;
+import org.openide.filesystems.*;
+
+import org.openoffice.idesupport.zip.ParcelZipper;
+import org.openoffice.netbeans.modules.office.loader.ParcelFolder;
+import org.openoffice.netbeans.modules.office.filesystem.OpenOfficeDocFileSystem;
+import org.openoffice.netbeans.modules.office.utils.PackageRemover;
+
+/** A template wizard iterator (sequence of panels).
+ * Used to fill in the second and subsequent panels in the New wizard.
+ * Associate this to a template inside a layer using the
+ * Sequence of Panels extra property.
+ * Create one or more panels from template as needed too.
+ *
+ * @author tomaso
+ */
+public class JavaScriptIterator implements TemplateWizard.Iterator {
+
+
+ // private static final long serialVersionUID = ...L;
+
+ // You should define what panels you want to use here:
+
+ protected WizardDescriptor.Panel[] createPanels() {
+ return new WizardDescriptor.Panel[] {
+ // keep the default 2nd panel:
+ wiz.targetChooser(),
+ };
+ }
+
+ // And the list of step names:
+
+ protected String[] createSteps() {
+ return new String[] {
+ null,
+ };
+ }
+
+ private DataFolder checkTarget(DataFolder folder) {
+ FileObject fo = folder.getPrimaryFile();
+
+ try {
+ FileSystem fs = fo.getFileSystem();
+
+ if (fs instanceof OpenOfficeDocFileSystem && fo.isRoot()) {
+ FileObject scripts =
+ fo.getFileObject(OpenOfficeDocFileSystem.SCRIPTS_ROOT);
+ if (scripts == null)
+ scripts =
+ fo.createFolder(OpenOfficeDocFileSystem.SCRIPTS_ROOT);
+
+ FileObject javafolder = scripts.getFileObject("java");
+ if (javafolder == null)
+ javafolder = scripts.createFolder("java");
+
+ DataFolder subfolder = new DataFolder(javafolder);
+ return subfolder;
+ }
+ }
+ catch (IOException ioe) {
+ /* do nothing, we will just return the folder we were passed in */
+ }
+ return folder;
+ }
+
+ public Set instantiate(TemplateWizard wiz) throws IOException {
+ String name = wiz.getTargetName();
+ DataFolder targetFolder = wiz.getTargetFolder();
+ targetFolder = checkTarget(targetFolder);
+
+ DataObject template = wiz.getTemplate();
+ DataObject result;
+ if (name == null) {
+ // Default name.
+ result = template.createFromTemplate(targetFolder);
+ } else {
+ result = template.createFromTemplate(targetFolder, name);
+ }
+
+ FileObject tmp = result.getPrimaryFile();
+ if (tmp.getExt().equals("java")) {
+ try {
+ PackageRemover.removeDeclaration(FileUtil.toFile(tmp));
+
+ // IssueZilla 11986 - rename the FileObject
+ // so the JavaNode is resynchronized
+ tmp.rename(tmp.lock(), tmp.getName(), tmp.getExt());
+ }
+ catch (IOException ioe) {
+ NotifyDescriptor d = new NotifyDescriptor.Message(
+ "Error removing package declaration from file: " +
+ tmp.getNameExt() +
+ ". You should manually remove this declaration " +
+ "before building the Parcel Recipe");
+ TopManager.getDefault().notify(d);
+ }
+ }
+
+ return Collections.singleton(result);
+ }
+
+ // --- The rest probably does not need to be touched. ---
+
+ private transient int index;
+ private transient WizardDescriptor.Panel[] panels;
+ private transient TemplateWizard wiz;
+
+ // You can keep a reference to the TemplateWizard which can
+ // provide various kinds of useful information such as
+ // the currently selected target name.
+ // Also the panels will receive wiz as their "settings" object.
+ public void initialize(TemplateWizard wiz) {
+ this.wiz = wiz;
+ index = 0;
+ panels = createPanels();
+ // Make sure list of steps is accurate.
+ String[] steps = createSteps();
+ for (int i = 0; i < panels.length; i++) {
+ Component c = panels[i].getComponent();
+ if (steps[i] == null) {
+ // Default step name to component name of panel.
+ // Mainly useful for getting the name of the target
+ // chooser to appear in the list of steps.
+ steps[i] = c.getName();
+ }
+ if (c instanceof JComponent) { // assume Swing components
+ JComponent jc = (JComponent)c;
+ // Step #.
+ jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i)); // NOI18N
+ // Step name (actually the whole list for reference).
+ jc.putClientProperty("WizardPanel_contentData", steps); // NOI18N
+ }
+ }
+ }
+ public void uninitialize(TemplateWizard wiz) {
+ this.wiz = null;
+ panels = null;
+ }
+
+ // --- WizardDescriptor.Iterator METHODS: ---
+ // Note that this is very similar to WizardDescriptor.Iterator, but with a
+ // few more options for customization. If you e.g. want to make panels appear
+ // or disappear dynamically, go ahead.
+
+ public String name() {
+ return "";
+ }
+
+ public boolean hasNext() {
+ return index < panels.length - 1;
+ }
+ public boolean hasPrevious() {
+ return index > 0;
+ }
+ public void nextPanel() {
+ if (!hasNext()) throw new NoSuchElementException();
+ index++;
+ }
+ public void previousPanel() {
+ if (!hasPrevious()) throw new NoSuchElementException();
+ index--;
+ }
+ public WizardDescriptor.Panel current() {
+ return panels[index];
+ }
+
+ // If nothing unusual changes in the middle of the wizard, simply:
+ public final void addChangeListener(ChangeListener l) {}
+ public final void removeChangeListener(ChangeListener l) {}
+ // If something changes dynamically (besides moving between panels),
+ // e.g. the number of panels changes in response to user input, then
+ // uncomment the following and call when needed:
+ // fireChangeEvent();
+ /*
+ private transient Set listeners = new HashSet(1); // Set<ChangeListener>
+ public final void addChangeListener(ChangeListener l) {
+ synchronized(listeners) {
+ listeners.add(l);
+ }
+ }
+ public final void removeChangeListener(ChangeListener l) {
+ synchronized(listeners) {
+ listeners.remove(l);
+ }
+ }
+ protected final void fireChangeEvent() {
+ Iterator it;
+ synchronized (listeners) {
+ it = new HashSet(listeners).iterator();
+ }
+ ChangeEvent ev = new ChangeEvent(this);
+ while (it.hasNext()) {
+ ((ChangeListener)it.next()).stateChanged(ev);
+ }
+ }
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ in.defaultReadObject();
+ listeners = new HashSet(1);
+ }
+ */
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelContentsIterator.java b/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelContentsIterator.java
new file mode 100644
index 000000000000..5978ae6a19a9
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelContentsIterator.java
@@ -0,0 +1,254 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+package org.openoffice.netbeans.modules.office.wizard;
+
+import java.awt.Component;
+import java.io.File;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import javax.swing.JComponent;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openide.TopManager;
+import org.openide.NotifyDescriptor;
+import org.openide.WizardDescriptor;
+import org.openide.cookies.OpenCookie;
+import org.openide.cookies.SourceCookie;
+import org.openide.loaders.*;
+import org.openide.util.NbBundle;
+import org.openide.filesystems.*;
+
+import com.sun.star.script.framework.container.ParcelDescriptor;
+import org.openoffice.idesupport.zip.ParcelZipper;
+import org.openoffice.netbeans.modules.office.loader.ParcelFolder;
+import org.openoffice.netbeans.modules.office.loader.ParcelContentsFolder;
+import org.openoffice.netbeans.modules.office.filesystem.OpenOfficeDocFileSystem;
+
+/** A template wizard iterator (sequence of panels).
+ * Used to fill in the second and subsequent panels in the New wizard.
+ * Associate this to a template inside a layer using the
+ * Sequence of Panels extra property.
+ * Create one or more panels from template as needed too.
+ *
+ * @author tomaso
+ */
+public class ParcelContentsIterator implements TemplateWizard.Iterator {
+
+
+ // private static final long serialVersionUID = ...L;
+
+ // You should define what panels you want to use here:
+
+ public static final String PROP_LANGUAGE =
+ ParcelFolder.LANGUAGE_ATTRIBUTE;
+
+ protected WizardDescriptor.Panel[] createPanels() {
+ return new WizardDescriptor.Panel[] {
+ // keep the default 2nd panel:
+ // wiz.targetChooser(),
+ new ParcelPropertiesPanel(),
+ };
+ }
+
+ // And the list of step names:
+
+ protected String[] createSteps() {
+ return new String[] {
+ // null,
+ "Parcel Properties",
+ };
+ }
+
+ private DataFolder checkTarget(DataFolder folder) {
+ FileObject fo = folder.getPrimaryFile();
+
+ try {
+ FileSystem fs = fo.getFileSystem();
+
+ if (fs instanceof OpenOfficeDocFileSystem && fo.isRoot()) {
+ FileObject scripts =
+ fo.getFileObject(OpenOfficeDocFileSystem.SCRIPTS_ROOT);
+ if (scripts == null)
+ scripts =
+ fo.createFolder(OpenOfficeDocFileSystem.SCRIPTS_ROOT);
+
+ FileObject javafolder = scripts.getFileObject("java");
+ if (javafolder == null)
+ javafolder = scripts.createFolder("java");
+
+ DataFolder subfolder = new DataFolder(javafolder);
+ return subfolder;
+ }
+ }
+ catch (IOException ioe) {
+ /* do nothing, we will just return the folder we were passed in */
+ }
+ return folder;
+ }
+
+ public Set instantiate(TemplateWizard wiz) throws IOException {
+ String name = wiz.getTargetName();
+ DataFolder targetFolder = wiz.getTargetFolder();
+ targetFolder = checkTarget(targetFolder);
+
+ String language = (String)wiz.getProperty(PROP_LANGUAGE);
+
+ DataObject template = wiz.getTemplate();
+ DataObject result;
+ if (name == null) {
+ // Default name.
+ result = template.createFromTemplate(targetFolder);
+ } else {
+ result = template.createFromTemplate(targetFolder, name);
+ }
+
+ FileObject recipe = result.getPrimaryFile();
+
+ FileObject contents =
+ recipe.getFileObject(ParcelZipper.CONTENTS_DIRNAME);
+
+ if (contents != null) {
+ File f = FileUtil.toFile(contents);
+ ParcelDescriptor pd = ParcelDescriptor.createParcelDescriptor(f);
+ pd.setLanguage(language);
+ pd.write();
+
+ DataFolder parent = DataFolder.findFolder(contents);
+ ParcelContentsFolder.createEmptyScript(parent, language);
+ }
+
+ return Collections.singleton(result);
+ }
+
+ // --- The rest probably does not need to be touched. ---
+
+ private transient int index;
+ private transient WizardDescriptor.Panel[] panels;
+ private transient TemplateWizard wiz;
+
+ // You can keep a reference to the TemplateWizard which can
+ // provide various kinds of useful information such as
+ // the currently selected target name.
+ // Also the panels will receive wiz as their "settings" object.
+ public void initialize(TemplateWizard wiz) {
+ this.wiz = wiz;
+ index = 0;
+ panels = createPanels();
+ // Make sure list of steps is accurate.
+ String[] steps = createSteps();
+ for (int i = 0; i < panels.length; i++) {
+ Component c = panels[i].getComponent();
+ if (steps[i] == null) {
+ // Default step name to component name of panel.
+ // Mainly useful for getting the name of the target
+ // chooser to appear in the list of steps.
+ steps[i] = c.getName();
+ }
+ if (c instanceof JComponent) { // assume Swing components
+ JComponent jc = (JComponent)c;
+ // Step #.
+ jc.putClientProperty("WizardPanel_contentSelectedIndex", new Integer(i)); // NOI18N
+ // Step name (actually the whole list for reference).
+ jc.putClientProperty("WizardPanel_contentData", steps); // NOI18N
+ }
+ }
+ }
+ public void uninitialize(TemplateWizard wiz) {
+ this.wiz = null;
+ panels = null;
+ }
+
+ // --- WizardDescriptor.Iterator METHODS: ---
+ // Note that this is very similar to WizardDescriptor.Iterator, but with a
+ // few more options for customization. If you e.g. want to make panels appear
+ // or disappear dynamically, go ahead.
+
+ public String name() {
+ return "";
+ }
+
+ public boolean hasNext() {
+ return index < panels.length - 1;
+ }
+ public boolean hasPrevious() {
+ return index > 0;
+ }
+ public void nextPanel() {
+ if (!hasNext()) throw new NoSuchElementException();
+ index++;
+ }
+ public void previousPanel() {
+ if (!hasPrevious()) throw new NoSuchElementException();
+ index--;
+ }
+ public WizardDescriptor.Panel current() {
+ return panels[index];
+ }
+
+ // If nothing unusual changes in the middle of the wizard, simply:
+ public final void addChangeListener(ChangeListener l) {}
+ public final void removeChangeListener(ChangeListener l) {}
+ // If something changes dynamically (besides moving between panels),
+ // e.g. the number of panels changes in response to user input, then
+ // uncomment the following and call when needed:
+ // fireChangeEvent();
+ /*
+ private transient Set listeners = new HashSet(1); // Set<ChangeListener>
+ public final void addChangeListener(ChangeListener l) {
+ synchronized(listeners) {
+ listeners.add(l);
+ }
+ }
+ public final void removeChangeListener(ChangeListener l) {
+ synchronized(listeners) {
+ listeners.remove(l);
+ }
+ }
+ protected final void fireChangeEvent() {
+ Iterator it;
+ synchronized (listeners) {
+ it = new HashSet(listeners).iterator();
+ }
+ ChangeEvent ev = new ChangeEvent(this);
+ while (it.hasNext()) {
+ ((ChangeListener)it.next()).stateChanged(ev);
+ }
+ }
+ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
+ in.defaultReadObject();
+ listeners = new HashSet(1);
+ }
+ */
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesPanel.java b/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesPanel.java
new file mode 100644
index 000000000000..704bb6f66aed
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesPanel.java
@@ -0,0 +1,117 @@
+/*
+ * ParcelPropertiesPanel.java
+ *
+ * Created on January 15, 2003
+ */
+
+package org.openoffice.netbeans.modules.office.wizard;
+
+import java.awt.Component;
+import java.net.URL;
+import java.net.MalformedURLException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openide.WizardDescriptor;
+import org.openide.loaders.TemplateWizard;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+
+/** A single panel descriptor for a wizard.
+ * You probably want to make a wizard iterator to hold it.
+ *
+ * @author tomaso
+ */
+public class ParcelPropertiesPanel implements WizardDescriptor.FinishPanel {
+
+ /** The visual component that displays this panel.
+ * If you need to access the component from this class,
+ * just use getComponent().
+ */
+ private ParcelPropertiesVisualPanel component;
+
+ /** Create the wizard panel descriptor. */
+ public ParcelPropertiesPanel() {
+ }
+
+ // Get the visual component for the panel. In this template, the component
+ // is kept separate. This can be more efficient: if the wizard is created
+ // but never displayed, or not all panels are displayed, it is better to
+ // create only those which really need to be visible.
+ public Component getComponent() {
+ if (component == null) {
+ component = new ParcelPropertiesVisualPanel(this);
+ }
+ return component;
+ }
+
+ public HelpCtx getHelp() {
+ // Show no Help button for this panel:
+ return HelpCtx.DEFAULT_HELP;
+ // If you have context help:
+ // return new HelpCtx(ParcelPropertiesPanel.class);
+ }
+
+ public boolean isValid() {
+ // If it is always OK to press Next or Finish, then:
+ return true;
+ // If it depends on some condition (form filled out...), then:
+ // return someCondition();
+ // and when this condition changes (last form field filled in...) then:
+ // fireChangeEvent();
+ // and uncomment the complicated stuff below.
+ }
+
+ public final void addChangeListener(ChangeListener l) {}
+ public final void removeChangeListener(ChangeListener l) {}
+ /*
+ private final Set listeners = new HashSet(1); // Set<ChangeListener>
+ public final void addChangeListener(ChangeListener l) {
+ synchronized (listeners) {
+ listeners.add(l);
+ }
+ }
+ public final void removeChangeListener(ChangeListener l) {
+ synchronized (listeners) {
+ listeners.remove(l);
+ }
+ }
+ protected final void fireChangeEvent() {
+ Iterator it;
+ synchronized (listeners) {
+ it = new HashSet(listeners).iterator();
+ }
+ ChangeEvent ev = new ChangeEvent(this);
+ while (it.hasNext()) {
+ ((ChangeListener)it.next()).stateChanged(ev);
+ }
+ }
+ */
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+
+ private String language = "Java";
+ private String name = null;
+
+ // You can use a settings object to keep track of state.
+ // Normally the settings object will be the WizardDescriptor,
+ // so you can use WizardDescriptor.getProperty & putProperty
+ // to store information entered by the user.
+ public void readSettings(Object settings) {
+ }
+
+ public void storeSettings(Object settings) {
+ TemplateWizard wiz = (TemplateWizard)settings;
+ wiz.setTargetName(name);
+ wiz.putProperty(ParcelContentsIterator.PROP_LANGUAGE, language);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesVisualPanel.form b/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesVisualPanel.form
new file mode 100644
index 000000000000..0bfb183f5047
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesVisualPanel.form
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[500, 300]"/>
+ </Property>
+ </Properties>
+ <AuxValues>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,75,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel1">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Parcel Recipe Name"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="12" insetsLeft="12" insetsBottom="11" insetsRight="2" anchor="17" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JTextField" name="recipeName">
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="recipeNameActionPerformed"/>
+ <EventHandler event="focusGained" listener="java.awt.event.FocusListener" parameters="java.awt.event.FocusEvent" handler="recipeNameFocusGained"/>
+ <EventHandler event="focusLost" listener="java.awt.event.FocusListener" parameters="java.awt.event.FocusEvent" handler="recipeNameFocusLost"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="1" gridY="0" gridWidth="0" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="12" insetsLeft="0" insetsBottom="11" insetsRight="11" anchor="10" weightX="1.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabel2">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Initial Script Language"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="12" insetsBottom="11" insetsRight="12" anchor="17" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JComboBox" name="languagesComboBox">
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="languagesComboBoxActionPerformed"/>
+ </Events>
+ <AuxValues>
+ <AuxValue name="JavaCodeGenerator_InitCodePre" type="java.lang.String" value=""/>
+ <AuxValue name="JavaCodeGenerator_CreateCodePre" type="java.lang.String" value=""/>
+ <AuxValue name="JavaCodeGenerator_SerializeTo" type="java.lang.String" value=""/>
+ <AuxValue name="JavaCodeGenerator_CreateCodePost" type="java.lang.String" value=""/>
+ <AuxValue name="JavaCodeGenerator_CodeGeneration" type="java.lang.Integer" value="0"/>
+ </AuxValues>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="1" gridY="1" gridWidth="0" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="11" insetsRight="11" anchor="17" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Container class="javax.swing.JPanel" name="jPanel1">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="3" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="1.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesVisualPanel.java b/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesVisualPanel.java
new file mode 100644
index 000000000000..fa3ea085dadb
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesVisualPanel.java
@@ -0,0 +1,157 @@
+/*
+ * ParcelPropertiesVisualPanel.java
+ *
+ * Created on January 15, 2003
+ */
+
+package org.openoffice.netbeans.modules.office.wizard;
+
+import org.openide.util.NbBundle;
+
+/** A single panel for a wizard - the GUI portion.
+ *
+ * @author tomaso
+ */
+public class ParcelPropertiesVisualPanel extends javax.swing.JPanel {
+
+ /** The wizard panel descriptor associated with this GUI panel.
+ * If you need to fire state changes or something similar, you can
+ * use this handle to do so.
+ */
+ private final ParcelPropertiesPanel panel;
+
+ /** Create the wizard panel and set up some basic properties. */
+ public ParcelPropertiesVisualPanel(ParcelPropertiesPanel panel) {
+ this.panel = panel;
+ initComponents();
+
+ languagesComboBox.addItem("Java");
+ languagesComboBox.addItem("BeanShell");
+
+ // Provide a name in the title bar.
+ setName(NbBundle.getMessage(ParcelPropertiesVisualPanel.class, "TITLE_ParcelPropertiesVisualPanel"));
+ /*
+ // Optional: provide a special description for this pane.
+ // You must have turned on WizardDescriptor.WizardPanel_helpDisplayed
+ // (see descriptor in standard iterator template for an example of this).
+ try {
+ putClientProperty("WizardPanel_helpURL", // NOI18N
+ new URL("nbresloc:/org/openoffice/netbeans/modules/office/wizard/ParcelPropertiesVisualHelp.html")); // NOI18N
+ } catch (MalformedURLException mfue) {
+ throw new IllegalStateException(mfue.toString());
+ }
+ */
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ private void initComponents() {//GEN-BEGIN:initComponents
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ jLabel1 = new javax.swing.JLabel();
+ recipeName = new javax.swing.JTextField();
+ jLabel2 = new javax.swing.JLabel();
+ languagesComboBox = new javax.swing.JComboBox();
+ jPanel1 = new javax.swing.JPanel();
+
+ setLayout(new java.awt.GridBagLayout());
+
+ setPreferredSize(new java.awt.Dimension(500, 300));
+ jLabel1.setText("Parcel Recipe Name");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(12, 12, 11, 2);
+ add(jLabel1, gridBagConstraints);
+
+ recipeName.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ recipeNameActionPerformed(evt);
+ }
+ });
+
+ recipeName.addFocusListener(new java.awt.event.FocusAdapter() {
+ public void focusGained(java.awt.event.FocusEvent evt) {
+ recipeNameFocusGained(evt);
+ }
+ public void focusLost(java.awt.event.FocusEvent evt) {
+ recipeNameFocusLost(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.weightx = 1.0;
+ gridBagConstraints.insets = new java.awt.Insets(12, 0, 11, 11);
+ add(recipeName, gridBagConstraints);
+
+ jLabel2.setText("Initial Script Language");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(0, 12, 11, 12);
+ add(jLabel2, gridBagConstraints);
+
+ languagesComboBox.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ languagesComboBoxActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(0, 0, 11, 11);
+ add(languagesComboBox, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
+ gridBagConstraints.weighty = 1.0;
+ add(jPanel1, gridBagConstraints);
+
+ }//GEN-END:initComponents
+
+ private void recipeNameFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_recipeNameFocusGained
+ recipeName.selectAll();
+ }//GEN-LAST:event_recipeNameFocusGained
+
+ private void recipeNameFocusLost(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_recipeNameFocusLost
+ changeName();
+ }//GEN-LAST:event_recipeNameFocusLost
+
+ private void languagesComboBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_languagesComboBoxActionPerformed
+ String language = (String)languagesComboBox.getSelectedItem();
+ panel.setLanguage(language);
+ }//GEN-LAST:event_languagesComboBoxActionPerformed
+
+ private void recipeNameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_recipeNameActionPerformed
+ changeName();
+ }//GEN-LAST:event_recipeNameActionPerformed
+
+ private void changeName() {
+ String name = recipeName.getText().trim();
+ if (name.equals(""))
+ name = null;
+ panel.setName(name);
+ }
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JTextField recipeName;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JPanel jPanel1;
+ private javax.swing.JComboBox languagesComboBox;
+ // End of variables declaration//GEN-END:variables
+
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathPanel.java b/scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathPanel.java
new file mode 100644
index 000000000000..77f1c0f8b2e5
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathPanel.java
@@ -0,0 +1,123 @@
+/*
+ * SelectPathPanel.java
+ *
+ * Created on February 12, 2003
+ */
+
+package org.openoffice.netbeans.modules.office.wizard;
+
+import java.awt.Component;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.openide.WizardDescriptor;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+
+import org.openoffice.netbeans.modules.office.options.OfficeSettings;
+import org.openoffice.idesupport.OfficeInstallation;
+import org.openoffice.idesupport.SVersionRCFile;
+
+/** A single panel descriptor for a wizard.
+ * You probably want to make a wizard iterator to hold it.
+ *
+ * @author tomaso
+ */
+public class SelectPathPanel implements WizardDescriptor.Panel /* .FinishPanel */ {
+
+ /** The visual component that displays this panel.
+ * If you need to access the component from this class,
+ * just use getComponent().
+ */
+ private SelectPathVisualPanel component;
+ private OfficeInstallation office;
+
+ /** Create the wizard panel descriptor. */
+ public SelectPathPanel() {
+ office = OfficeSettings.getDefault().getOfficeDirectory();
+
+ if (office == null) {
+ try {
+ office = SVersionRCFile.createInstance().getDefaultVersion();
+ }
+ catch (java.io.IOException ioe) {}
+ }
+ }
+
+ // Get the visual component for the panel. In this template, the component
+ // is kept separate. This can be more efficient: if the wizard is created
+ // but never displayed, or not all panels are displayed, it is better to
+ // create only those which really need to be visible.
+ public Component getComponent() {
+ if (component == null) {
+ component = new SelectPathVisualPanel(this);
+ }
+ return component;
+ }
+
+ public HelpCtx getHelp() {
+ // Show no Help button for this panel:
+ return HelpCtx.DEFAULT_HELP;
+ // If you have context help:
+ // return new HelpCtx(SelectPathPanel.class);
+ }
+
+ public boolean isValid() {
+ // If it is always OK to press Next or Finish, then:
+ return true;
+ // If it depends on some condition (form filled out...), then:
+ // return someCondition();
+ // and when this condition changes (last form field filled in...) then:
+ // fireChangeEvent();
+ // and uncomment the complicated stuff below.
+ }
+
+ // public final void addChangeListener(ChangeListener l) {}
+ // public final void removeChangeListener(ChangeListener l) {}
+
+ private final Set listeners = new HashSet(1); // Set<ChangeListener>
+ public final void addChangeListener(ChangeListener l) {
+ synchronized (listeners) {
+ listeners.add(l);
+ }
+ }
+ public final void removeChangeListener(ChangeListener l) {
+ synchronized (listeners) {
+ listeners.remove(l);
+ }
+ }
+ protected final void fireChangeEvent() {
+ Iterator it;
+ synchronized (listeners) {
+ it = new HashSet(listeners).iterator();
+ }
+ ChangeEvent ev = new ChangeEvent(this);
+ while (it.hasNext()) {
+ ((ChangeListener)it.next()).stateChanged(ev);
+ }
+ }
+
+ public void setSelectedPath(OfficeInstallation oi) {
+ this.office = oi;
+ fireChangeEvent();
+ }
+
+ public OfficeInstallation getSelectedPath() {
+ return office;
+ }
+
+ // You can use a settings object to keep track of state.
+ // Normally the settings object will be the WizardDescriptor,
+ // so you can use WizardDescriptor.getProperty & putProperty
+ // to store information entered by the user.
+ public void readSettings(Object settings) {
+ }
+
+ public void storeSettings(Object settings) {
+ WizardDescriptor wiz = (WizardDescriptor)settings;
+ wiz.putProperty(InstallationPathDescriptor.PROP_INSTALLPATH, office);
+ }
+}
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathVisualPanel.form b/scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathVisualPanel.form
new file mode 100644
index 000000000000..b054e349f390
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathVisualPanel.form
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
+ <Properties>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[600, 300]"/>
+ </Property>
+ </Properties>
+ <AuxValues>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,27,0,0,2,1"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="jLabel1">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Installations Detected"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="12" insetsLeft="12" insetsBottom="11" insetsRight="2" anchor="17" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JTextField" name="installPath">
+ <Properties>
+ <Property name="editable" type="boolean" value="false"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="1" gridY="1" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="12" insetsLeft="0" insetsBottom="11" insetsRight="11" anchor="10" weightX="1.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabel2">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Installation Directory"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="12" insetsLeft="12" insetsBottom="11" insetsRight="12" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JComboBox" name="installationsComboBox">
+ <AuxValues>
+ <AuxValue name="JavaCodeGenerator_InitCodePre" type="java.lang.String" value=""/>
+ <AuxValue name="JavaCodeGenerator_CreateCodePre" type="java.lang.String" value=""/>
+ <AuxValue name="JavaCodeGenerator_SerializeTo" type="java.lang.String" value=""/>
+ <AuxValue name="JavaCodeGenerator_CreateCodePost" type="java.lang.String" value=""/>
+ <AuxValue name="JavaCodeGenerator_CodeGeneration" type="java.lang.Integer" value="0"/>
+ </AuxValues>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="1" gridY="0" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="11" insetsLeft="0" insetsBottom="11" insetsRight="11" anchor="17" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Container class="javax.swing.JPanel" name="jPanel1">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="2" gridWidth="1" gridHeight="1" fill="3" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="1.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignFlowLayout"/>
+ </Container>
+ <Component class="javax.swing.JButton" name="browseButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Browse..."/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="browseButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="2" gridY="1" gridWidth="0" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+</Form>
diff --git a/scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathVisualPanel.java b/scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathVisualPanel.java
new file mode 100644
index 000000000000..b39cd4452d4c
--- /dev/null
+++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/SelectPathVisualPanel.java
@@ -0,0 +1,196 @@
+/*
+ * SelectPathVisualPanel.java
+ *
+ * Created on February 12, 2003
+ */
+
+package org.openoffice.netbeans.modules.office.wizard;
+
+import java.util.Hashtable;
+import java.util.Enumeration;
+import java.io.File;
+import java.io.IOException;
+import javax.swing.JFileChooser;
+
+import org.openide.util.NbBundle;
+import org.openoffice.idesupport.SVersionRCFile;
+import org.openoffice.idesupport.OfficeInstallation;
+import org.openoffice.netbeans.modules.office.options.OfficeSettings;
+
+/** A single panel for a wizard - the GUI portion.
+ *
+ * @author tomaso
+ */
+public class SelectPathVisualPanel extends javax.swing.JPanel {
+
+ /** The wizard panel descriptor associated with this GUI panel.
+ * If you need to fire state changes or something similar, you can
+ * use this handle to do so.
+ */
+ private final SelectPathPanel panel;
+
+ /** Create the wizard panel and set up some basic properties. */
+ public SelectPathVisualPanel(SelectPathPanel panel) {
+ this.panel = panel;
+ initComponents();
+ OfficeInstallation orig = panel.getSelectedPath();
+
+ try {
+ Enumeration enumer = SVersionRCFile.createInstance().getVersions();
+
+ while (enumer.hasMoreElements()) {
+ OfficeInstallation oi = (OfficeInstallation)enumer.nextElement();
+ installationsComboBox.addItem(oi);
+ }
+ }
+ catch (IOException ioe) {
+ installationsComboBox.addItem("<empty>");
+ }
+
+ if (orig != null) {
+ installationsComboBox.setSelectedItem(orig);
+ installPath.setText(orig.getPath());
+ }
+
+ installationsComboBox.addActionListener(
+ new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ installationsComboBoxActionPerformed(evt);
+ }
+ }
+ );
+
+ // Provide a name in the title bar.
+ setName(NbBundle.getMessage(SelectPathVisualPanel.class, "TITLE_SelectPathVisualPanel"));
+ /*
+ // Optional: provide a special description for this pane.
+ // You must have turned on WizardDescriptor.WizardPanel_helpDisplayed
+ // (see descriptor in standard iterator template for an example of this).
+ try {
+ putClientProperty("WizardPanel_helpURL", // NOI18N
+ new URL("nbresloc:/org/openoffice/netbeans/modules/office/wizard/SelectPathVisualHelp.html")); // NOI18N
+ } catch (MalformedURLException mfue) {
+ throw new IllegalStateException(mfue.toString());
+ }
+ */
+ }
+
+ private void installationsComboBoxActionPerformed(
+ java.awt.event.ActionEvent evt) {
+
+ OfficeInstallation oi =
+ (OfficeInstallation)installationsComboBox.getSelectedItem();
+
+ installPath.setText(oi.getPath());
+ panel.setSelectedPath(oi);
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ private void initComponents() {//GEN-BEGIN:initComponents
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ jLabel1 = new javax.swing.JLabel();
+ installPath = new javax.swing.JTextField();
+ jLabel2 = new javax.swing.JLabel();
+ installationsComboBox = new javax.swing.JComboBox();
+ jPanel1 = new javax.swing.JPanel();
+ browseButton = new javax.swing.JButton();
+
+ setLayout(new java.awt.GridBagLayout());
+
+ setPreferredSize(new java.awt.Dimension(600, 300));
+ jLabel1.setText("Installations Detected");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(12, 12, 11, 2);
+ add(jLabel1, gridBagConstraints);
+
+ installPath.setEditable(false);
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.weightx = 1.0;
+ gridBagConstraints.insets = new java.awt.Insets(12, 0, 11, 11);
+ add(installPath, gridBagConstraints);
+
+ jLabel2.setText("Installation Directory");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.insets = new java.awt.Insets(12, 12, 11, 12);
+ add(jLabel2, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(11, 0, 11, 11);
+ add(installationsComboBox, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
+ gridBagConstraints.weighty = 1.0;
+ add(jPanel1, gridBagConstraints);
+
+ browseButton.setText("Browse...");
+ browseButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ browseButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 2;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER;
+ add(browseButton, gridBagConstraints);
+
+ }//GEN-END:initComponents
+
+ private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed
+ // Add your handling code here:
+ File target = null;
+
+ JFileChooser chooser = new JFileChooser();
+ chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
+ int result = chooser.showDialog(null, null);
+
+ if (result == JFileChooser.APPROVE_OPTION) {
+ target = chooser.getSelectedFile();
+
+ String path;
+ try {
+ path = target.getCanonicalPath();
+ }
+ catch (IOException ioe) {
+ path = target.getAbsolutePath();
+ }
+
+ OfficeInstallation oi = new OfficeInstallation(path, path);
+
+ if (oi.supportsFramework()) {
+ installPath.setText(path);
+ panel.setSelectedPath(oi);
+ }
+ }
+
+ }//GEN-LAST:event_browseButtonActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JTextField installPath;
+ private javax.swing.JButton browseButton;
+ private javax.swing.JComboBox installationsComboBox;
+ private javax.swing.JLabel jLabel2;
+ private javax.swing.JLabel jLabel1;
+ private javax.swing.JPanel jPanel1;
+ // End of variables declaration//GEN-END:variables
+}