diff options
Diffstat (limited to 'scripting/java/org/openoffice/netbeans/modules')
89 files changed, 8145 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..3feae839f531 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/BuildParcelAction.java @@ -0,0 +1,72 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: BuildParcelAction.java,v $ + * $Revision: 1.6 $ + * + * 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..e9aa01340ad7 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/CompileParcelAction.java @@ -0,0 +1,47 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: CompileParcelAction.java,v $ + * $Revision: 1.6 $ + * + * 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..21209dd715f4 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ConfigureParcelAction.java @@ -0,0 +1,73 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ConfigureParcelAction.java,v $ + * $Revision: 1.6 $ + * + * 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..ab414dacd78b --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/DeployParcelAction.java @@ -0,0 +1,247 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DeployParcelAction.java,v $ + * $Revision: 1.9 $ + * + * 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..5925e498bdc7 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/MountDocumentAction.java @@ -0,0 +1,88 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: MountDocumentAction.java,v $ + * $Revision: 1.4 $ + * + * 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..201333827184 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/MountParcelAction.java @@ -0,0 +1,87 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: MountParcelAction.java,v $ + * $Revision: 1.4 $ + * + * 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..eba503d5eb10 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/OfficeDocumentCookie.java @@ -0,0 +1,45 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OfficeDocumentCookie.java,v $ + * $Revision: 1.4 $ + * + * 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..82d8887189cf --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/OfficeDocumentSupport.java @@ -0,0 +1,146 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OfficeDocumentSupport.java,v $ + * $Revision: 1.6 $ + * + * 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..a48e50acb245 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelCookie.java @@ -0,0 +1,45 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelCookie.java,v $ + * $Revision: 1.5 $ + * + * 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..a0adf2633aa0 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorEditorSupport.java @@ -0,0 +1,144 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDescriptorEditorSupport.java,v $ + * $Revision: 1.4 $ + * + * 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..cafc7ed714a5 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorParserCookie.java @@ -0,0 +1,45 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDescriptorParserCookie.java,v $ + * $Revision: 1.4 $ + * + * 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..dc019f734359 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelDescriptorParserSupport.java @@ -0,0 +1,124 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDescriptorParserSupport.java,v $ + * $Revision: 1.4 $ + * + * 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..fa2dc61b0f48 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelFolderCookie.java @@ -0,0 +1,45 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelFolderCookie.java,v $ + * $Revision: 1.7 $ + * + * 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..5cd6640053cf --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelFolderSupport.java @@ -0,0 +1,260 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelFolderSupport.java,v $ + * $Revision: 1.15 $ + * + * 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..589b8914da31 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/actions/ParcelSupport.java @@ -0,0 +1,194 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelSupport.java,v $ + * $Revision: 1.6 $ + * + * 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..3137b89dde94 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/Bundle.properties @@ -0,0 +1,43 @@ +# Filesystems API +# {0} - root path +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..7355e07e9661 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/OpenOfficeDocFileSystem.java @@ -0,0 +1,1195 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OpenOfficeDocFileSystem.java,v $ + * $Revision: 1.5 $ + * + * 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..28fa3697c83e --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/filesystem/OpenOfficeDocFileSystemBeanInfo.java @@ -0,0 +1,128 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OpenOfficeDocFileSystemBeanInfo.java,v $ + * $Revision: 1.5 $ + * + * 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..a3bf47447607 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/Bundle.properties @@ -0,0 +1,12 @@ +# 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> +# 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..b03e123b7d75 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataLoader.java @@ -0,0 +1,115 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OfficeDocumentDataLoader.java,v $ + * $Revision: 1.4 $ + * + * 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..d953058063a3 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataLoaderBeanInfo.java @@ -0,0 +1,75 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OfficeDocumentDataLoaderBeanInfo.java,v $ + * $Revision: 1.5 $ + * + * 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..d0f722137e15 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataNode.java @@ -0,0 +1,123 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OfficeDocumentDataNode.java,v $ + * $Revision: 1.5 $ + * + * 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..7f013d122633 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/OfficeDocumentDataObject.java @@ -0,0 +1,61 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OfficeDocumentDataObject.java,v $ + * $Revision: 1.4 $ + * + * 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..efc0869f0e4f --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolder.java @@ -0,0 +1,140 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelContentsFolder.java,v $ + * $Revision: 1.6 $ + * + * 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..e041153efa0c --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolderDataLoader.java @@ -0,0 +1,85 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelContentsFolderDataLoader.java,v $ + * $Revision: 1.6 $ + * + * 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..fafbe279d6be --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelContentsFolderDataLoaderBeanInfo.java @@ -0,0 +1,79 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelContentsFolderDataLoaderBeanInfo.java,v $ + * $Revision: 1.4 $ + * + * 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..7c19575663f4 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataLoader.java @@ -0,0 +1,92 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDataLoader.java,v $ + * $Revision: 1.4 $ + * + * 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..21237248a2ad --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataLoaderBeanInfo.java @@ -0,0 +1,79 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDataLoaderBeanInfo.java,v $ + * $Revision: 1.4 $ + * + * 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..e773e1474a87 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataNode.java @@ -0,0 +1,117 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDataNode.java,v $ + * $Revision: 1.5 $ + * + * 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..89aaf89e7a56 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDataObject.java @@ -0,0 +1,80 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDataObject.java,v $ + * $Revision: 1.4 $ + * + * 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..6744211c939c --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataLoader.java @@ -0,0 +1,94 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDescriptorDataLoader.java,v $ + * $Revision: 1.5 $ + * + * 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..6893c6caff58 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataLoaderBeanInfo.java @@ -0,0 +1,79 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDescriptorDataLoaderBeanInfo.java,v $ + * $Revision: 1.4 $ + * + * 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..853566176cac --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataNode.java @@ -0,0 +1,84 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDescriptorDataNode.java,v $ + * $Revision: 1.4 $ + * + * 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..999227d8509c --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelDescriptorDataObject.java @@ -0,0 +1,86 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDescriptorDataObject.java,v $ + * $Revision: 1.4 $ + * + * 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..5776ef4b6311 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolder.java @@ -0,0 +1,306 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelFolder.java,v $ + * $Revision: 1.8 $ + * + * 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..334e324fb010 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolderDataLoader.java @@ -0,0 +1,115 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelFolderDataLoader.java,v $ + * $Revision: 1.4 $ + * + * 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..87a5b23a168e --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/loader/ParcelFolderDataLoaderBeanInfo.java @@ -0,0 +1,79 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelFolderDataLoaderBeanInfo.java,v $ + * $Revision: 1.4 $ + * + * 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..22a79eb69b32 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/nodes/OfficeDocumentChildren.java @@ -0,0 +1,150 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OfficeDocumentChildren.java,v $ + * $Revision: 1.7 $ + * + * 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..84a4c571becd --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/nodes/ParcelDescriptorChildren.java @@ -0,0 +1,94 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelDescriptorChildren.java,v $ + * $Revision: 1.4 $ + * + * 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..1676a326c492 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/nodes/ScriptNode.java @@ -0,0 +1,212 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ScriptNode.java,v $ + * $Revision: 1.4 $ + * + * 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..b823204cb227 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/options/Bundle.properties @@ -0,0 +1,13 @@ +# Options API +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..d4123727baf1 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettings.java @@ -0,0 +1,136 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OfficeSettings.java,v $ + * $Revision: 1.8 $ + * + * 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..ac6a69d178bf --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsBeanInfo.java @@ -0,0 +1,150 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OfficeSettingsBeanInfo.java,v $ + * $Revision: 1.6 $ + * + * 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 Binary files differnew file mode 100644 index 000000000000..9bed8526705b --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon.gif diff --git a/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon32.gif b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon32.gif Binary files differnew file mode 100644 index 000000000000..65bfc82bc25f --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/options/OfficeSettingsIcon32.gif 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..58989c2506b7 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/Bundle.properties @@ -0,0 +1,23 @@ +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 Binary files differnew file mode 100644 index 000000000000..ec7507ef9e54 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon.gif diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon32.gif b/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon32.gif Binary files differnew file mode 100644 index 000000000000..94fdab1eba0c --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OfficeIcon32.gif 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 Binary files differnew file mode 100644 index 000000000000..a441019346f9 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon.png diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon32.png b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon32.png Binary files differnew file mode 100644 index 000000000000..1b2ee21e6d9c --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/OpenOfficeDocFileSystemIcon32.png diff --git a/scripting/java/org/openoffice/netbeans/modules/office/resources/ParcelIcon.gif b/scripting/java/org/openoffice/netbeans/modules/office/resources/ParcelIcon.gif Binary files differnew file mode 100644 index 000000000000..a889c2614edf --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/ParcelIcon.gif 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 Binary files differnew file mode 100755 index 000000000000..ae40f9af595f --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/resources/webLink.gif 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..eae95b6e9dd6 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/FrameworkJarChecker.java @@ -0,0 +1,143 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: FrameworkJarChecker.java,v $ + * $Revision: 1.5 $ + * + * 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..9b64258a1663 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/ManifestParser.java @@ -0,0 +1,100 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ManifestParser.java,v $ + * $Revision: 1.8 $ + * + * 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..4befc9f089b9 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/NagDialog.java @@ -0,0 +1,130 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: NagDialog.java,v $ + * $Revision: 1.4 $ + * + * 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..ddc5672f1dc4 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/OfficeModule.java @@ -0,0 +1,71 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: OfficeModule.java,v $ + * $Revision: 1.7 $ + * + * 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..88170dbe194b --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/PackageRemover.java @@ -0,0 +1,109 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: PackageRemover.java,v $ + * $Revision: 1.6 $ + * + * 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..500449010372 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/utils/ZipMounter.java @@ -0,0 +1,95 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ZipMounter.java,v $ + * $Revision: 1.4 $ + * + * 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..0e4f2bd100c7 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/Bundle.properties @@ -0,0 +1,26 @@ +# Window System API + +# 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..114decafc614 --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/JavaScriptIterator.java @@ -0,0 +1,253 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: JavaScriptIterator.java,v $ + * $Revision: 1.4 $ + * + * 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..77048506dd5d --- /dev/null +++ b/scripting/java/org/openoffice/netbeans/modules/office/wizard/ParcelContentsIterator.java @@ -0,0 +1,257 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: ParcelContentsIterator.java,v $ + * $Revision: 1.10 $ + * + * 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 +} |