From 480180ea1c658df5ffb14ef71e6b8e1e9645c1ef Mon Sep 17 00:00:00 2001 From: ali_salman Date: Mon, 11 Apr 2016 16:39:50 +0500 Subject: [PATCH 1/3] Aspose.Slides Java for NetBeans --- .../LICENSE | 21 + .../README.md | 44 ++ .../Release Notes.html | 17 + .../src/com/aspose/slides/maven/Aspose.png | Bin 0 -> 3449 bytes .../maven/AsposeMavenBasicPanelVisual.form | 347 ++++++++++ .../maven/AsposeMavenBasicPanelVisual.java | 600 +++++++++++++++++ .../maven/AsposeMavenBasicWizardPanel.java | 146 ++++ .../slides/maven/AsposeMavenProject.zip | Bin 0 -> 1200 bytes .../AsposeMavenProjectWizardIterator.java | 399 +++++++++++ .../maven/AsposeSlidesMavenDescription.html | 13 + .../com/aspose/slides/maven/Bundle.properties | 43 ++ .../aspose/slides/maven/MavenSettings.java | 74 ++ .../slides/maven/artifacts/Metadata.java | 362 ++++++++++ .../slides/maven/artifacts/ObjectFactory.java | 55 ++ .../slides/maven/artifacts/maven-metada.xml | 17 + .../slides/maven/artifacts/maven-metadata.xsd | 30 + .../maven/examples/AsposeExamplePanel.java | 325 +++++++++ .../maven/examples/AsposeExampleWizard.html | 13 + .../examples/AsposeExampleWizardIterator.java | 184 +++++ .../examples/AsposeExampleWizardPanel.java | 201 ++++++ .../slides/maven/examples/Bundle.properties | 8 + .../maven/examples/CustomMutableTreeNode.java | 70 ++ .../slides/maven/utils/AbstractTask.java | 31 + .../slides/maven/utils/AsposeConstants.java | 144 ++++ .../slides/maven/utils/AsposeJavaAPI.java | 170 +++++ .../utils/AsposeMavenProjectManager.java | 634 ++++++++++++++++++ .../maven/utils/AsposeSlidesJavaAPI.java | 78 +++ .../slides/maven/utils/FormatExamples.java | 33 + .../aspose/slides/maven/utils/GitHelper.java | 76 +++ .../slides/maven/utils/TasksExecutor.java | 78 +++ .../src/resources/long-banner.png | Bin 0 -> 47286 bytes 31 files changed, 4213 insertions(+) create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/LICENSE create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/README.md create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/Release Notes.html create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/Aspose.png create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicPanelVisual.form create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicPanelVisual.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicWizardPanel.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenProject.zip create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenProjectWizardIterator.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeSlidesMavenDescription.html create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/Bundle.properties create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/MavenSettings.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/Metadata.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/ObjectFactory.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/maven-metada.xml create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/maven-metadata.xsd create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExamplePanel.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizard.html create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizardIterator.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizardPanel.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/Bundle.properties create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/CustomMutableTreeNode.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AbstractTask.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeConstants.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeJavaAPI.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeMavenProjectManager.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeSlidesJavaAPI.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/FormatExamples.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/GitHelper.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/TasksExecutor.java create mode 100644 Plugins/Aspose.Slides Java (Maven) for NetBeans/src/resources/long-banner.png diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/LICENSE b/Plugins/Aspose.Slides Java (Maven) for NetBeans/LICENSE new file mode 100644 index 00000000..5d8a0415 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2001-2016 Aspose Pty Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/README.md b/Plugins/Aspose.Slides Java (Maven) for NetBeans/README.md new file mode 100644 index 00000000..fd6af9ca --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/README.md @@ -0,0 +1,44 @@ +## Aspose.Slides Java (Maven) for NetBeans + +This project is **NetBeans IDE plugin** which lets developers use [Aspose.Slides for Java](http://www.aspose.com/java/powerpoint-component.aspx) in their Maven based Java projects. + +## Who is supposed to use this **Plugin?** + +This plugin is intended for developers using Maven platform for Java developments and want to use [Aspose.Slides for Java](http://www.aspose.com/java/powerpoint-component.aspx) in their projects. + +**NOTE:** [Aspose.Slides for Java](http://www.aspose.com/java/powerpoint-component.aspx) is Java API developed by [Aspose](http://aspose.com) that enables Java applications to read, write and manipulate PowerPoint documents (PPT, PPTX, POS, PPS, POTX, PPSX) PDF, HTML and image file formats without using Microsoft PowerPoint. For the API detailed features list check the [link](http://www.aspose.com/java/powerpoint-component.aspx). + +## **Features** + +The plugin provides following features to work with [Aspose.Slides for Java](http://www.aspose.com/java/powerpoint-component.aspx) API within **NetBeans IDE** comfortably: + +### Aspose.Slides Maven Project (wizard) +![plugin title shot](http://i.imgur.com/WgqE1lT.png) + +* By using this wizard plugin creates Maven project for using [Aspose.Slides for Java](http://www.aspose.com/java/powerpoint-component.aspx) from **New Project -> Maven-> Aspose.Slides Maven Project** +* The wizard will also give option for downloading latest available Code Examples for using the API. + +### Aspose.Slides Code Example (wizard) +![plugin title shot](http://i.imgur.com/IFie2Rq.png) +* By using this wizard plugin lets you copy the downloaded Code Examples into your project for using [Aspose.Slides for Java](http://www.aspose.com/java/powerpoint-component.aspx) from **New File -> Java -> Aspose.Slides Code Example** +* The wizard will also look for and updates for newly available Code Examples from [Aspose.Slides for Java examples repository.](https://github.com/aspose-slides/Aspose.Slides-for-Java/tree/master/Examples) + **NOTE:** Selected Code Examples (category) source codes will be copied under **"com.aspose.slides.examples"** package. Resources needed for running examples will be copied to the corresponding directory (package) within **"src/main/resources"**. + +### Other Features + +* Supports latest **NetBeans 8.1** version +* Compatible with **Mac**, **Linux Flavors** and **Windows** +* Native IDE user experience +* Open Source + +## What is Aspose.Slides Java API? + +**Aspose.Slides for Java** is a unique PowerPoint management component that enables Java applications to read, write and manipulate PowerPoint documents (PPT, PPTX, POS, PPS, POTX, PPSX) PDF, HTML and image file formats without using Microsoft PowerPoint. + +**Aspose.Slides for Java** is the first and only Java component that provides functionality to manage PowerPoint documents within your own applications. As with all Aspose Java components, Aspose.Slides for Java is written in pure Java, incredibly priced and lightning fast. + +For more info about the **Aspose.Slides for Java API**, [please check the api documentation - click here](http://www.aspose.com/java/powerpoint-component.aspx) + +## Plugin Documentation + +For the most complete documentation, [Please check this WIKI](http://www.aspose.com/docs/display/slidesjava/Aspose.Slides+Java+for+NetBeans+-+Maven) \ No newline at end of file diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/Release Notes.html b/Plugins/Aspose.Slides Java (Maven) for NetBeans/Release Notes.html new file mode 100644 index 00000000..15a396a0 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/Release Notes.html @@ -0,0 +1,17 @@ + + + +Aspose.Slides Java (Maven) for NetBeans - Release Notes + + + + +Aspose.Slides Java (Maven) for NetBeans - v1.0 +

This is new Plugin for NetBeans IDE by Aspose. This plugin is intended for developers using Maven platform for Java developments and want to use Aspose.Slides for Java in their projects.

+

NOTE: Aspose.Slides for Java is Java API developed by Aspose that enables Java applications to read, write and manipulate PowerPoint documents (PPT, PPTX, POS, PPS, POTX, PPSX) PDF, HTML and image file formats without using Microsoft PowerPoint. For the API detailed features list check the link. +

The plugin provides following features to work with Aspose.Slides for Java API within NetBeans IDE comfortably: +

+ + \ No newline at end of file diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/Aspose.png b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/Aspose.png new file mode 100644 index 0000000000000000000000000000000000000000..b403127191f02e479f737b3836563419486d132b GIT binary patch literal 3449 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 Oh^_car2Y9iFyg3*}7NH$>ZZNS)_#FHw+vaPBF zH3KP1i;J???b4whQmZ`WC{IZsN-pkljzo8lbmICd`~^K|v1{}Vxfd^SXJ>F{(o%LB zXZkzEiBA;9K2ZPk37V#%%=Gk%K+uqjvANOyjHF52>>`dVR^+t(fo+Qtk*-X1UnLOG bWIg-_vMUP~&qvr<00000NkvXXu0mjfB6Dwz literal 0 HcmV?d00001 diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicPanelVisual.form b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicPanelVisual.form new file mode 100644 index 00000000..66296a6d --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicPanelVisual.form @@ -0,0 +1,347 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicPanelVisual.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicPanelVisual.java new file mode 100644 index 00000000..3ec560e0 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicPanelVisual.java @@ -0,0 +1,600 @@ +package com.aspose.slides.maven; + +import static com.aspose.slides.maven.Bundle.TXT_MavenProjectName; +import java.awt.Image; +import java.io.File; +import javax.swing.ImageIcon; +import javax.swing.JFileChooser; +import javax.swing.JPanel; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.Document; +import org.netbeans.spi.project.ui.support.ProjectChooser; +import org.openide.WizardDescriptor; +import org.openide.WizardValidationException; +import org.openide.filesystems.FileUtil; +import org.openide.util.NbBundle; + +/** + * @author Adeel Ilyas + */ +public class AsposeMavenBasicPanelVisual extends JPanel implements DocumentListener { + + /** + * + */ + public static final String PROP_PROJECT_NAME = "projectName"; + + /** + * + */ + public static final String PROP_GROUP_ID = "groupId"; + + private AsposeMavenBasicWizardPanel panel; + private boolean txtPackageCustom = false; + + /** + * + * @param panel + */ + public AsposeMavenBasicPanelVisual(AsposeMavenBasicWizardPanel panel) { + initComponents(); + this.panel = panel; + // Register listener on the textFields to make the automatic updates + projectNameTextField.getDocument().addDocumentListener(this); + projectLocationTextField.getDocument().addDocumentListener(this); + txtGroupId.getDocument().addDocumentListener(this); + txtPackage.getDocument().addDocumentListener(this); + txtVersion.getDocument().addDocumentListener(this); + txtGroupId.setText(MavenSettings.getDefault().getLastArchetypeGroupId()); + txtVersion.setText(MavenSettings.getDefault().getLastArchetypeVersion()); + } + + /** + * + * @return + */ + public String getProjectName() { + return this.projectNameTextField.getText(); + } + + /** + * 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. + */ + // //GEN-BEGIN:initComponents + private void initComponents() { + + projectNameLabel = new javax.swing.JLabel(); + projectNameTextField = new javax.swing.JTextField(); + projectLocationLabel = new javax.swing.JLabel(); + projectLocationTextField = new javax.swing.JTextField(); + browseButton = new javax.swing.JButton(); + createdFolderLabel = new javax.swing.JLabel(); + createdFolderTextField = new javax.swing.JTextField(); + lblPackage = new javax.swing.JLabel(); + txtVersion = new javax.swing.JTextField(); + lblVersion = new javax.swing.JLabel(); + txtGroupId = new javax.swing.JTextField(); + lblGroupId = new javax.swing.JLabel(); + lblArtifactId = new javax.swing.JLabel(); + txtArtifactId = new javax.swing.JTextField(); + txtPackage = new javax.swing.JTextField(); + lblPackage1 = new javax.swing.JLabel(); + jCheckBox1 = new javax.swing.JCheckBox(); + jLabel1 = new javax.swing.JLabel(); + jLabel2 = new javax.swing.JLabel(); + jLabel3 = new javax.swing.JLabel(); + + projectNameLabel.setLabelFor(projectNameTextField); + org.openide.awt.Mnemonics.setLocalizedText(projectNameLabel, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.projectNameLabel.text")); // NOI18N + + projectNameTextField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + projectNameTextFieldActionPerformed(evt); + } + }); + + projectLocationLabel.setLabelFor(projectLocationTextField); + org.openide.awt.Mnemonics.setLocalizedText(projectLocationLabel, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.projectLocationLabel.text")); // NOI18N + + projectLocationTextField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + projectLocationTextFieldActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(browseButton, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.browseButton.text")); // NOI18N + browseButton.setActionCommand(org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.browseButton.actionCommand")); // NOI18N + browseButton.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + browseButtonActionPerformed(evt); + } + }); + + createdFolderLabel.setLabelFor(createdFolderTextField); + org.openide.awt.Mnemonics.setLocalizedText(createdFolderLabel, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.createdFolderLabel.text")); // NOI18N + + createdFolderTextField.setEditable(false); + createdFolderTextField.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + createdFolderTextFieldActionPerformed(evt); + } + }); + + lblPackage.setLabelFor(txtPackage); + org.openide.awt.Mnemonics.setLocalizedText(lblPackage, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.lblPackage.text")); // NOI18N + + txtVersion.setText(org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.txtVersion.text")); // NOI18N + txtVersion.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + txtVersionActionPerformed(evt); + } + }); + + lblVersion.setLabelFor(txtVersion); + org.openide.awt.Mnemonics.setLocalizedText(lblVersion, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.lblVersion.text")); // NOI18N + + txtGroupId.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + txtGroupIdActionPerformed(evt); + } + }); + + lblGroupId.setLabelFor(txtGroupId); + org.openide.awt.Mnemonics.setLocalizedText(lblGroupId, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.lblGroupId.text")); // NOI18N + + lblArtifactId.setLabelFor(txtArtifactId); + org.openide.awt.Mnemonics.setLocalizedText(lblArtifactId, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.lblArtifactId.text")); // NOI18N + + txtArtifactId.setEditable(false); + txtArtifactId.setEnabled(false); + txtArtifactId.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + txtArtifactIdActionPerformed(evt); + } + }); + + txtPackage.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + txtPackageActionPerformed(evt); + } + }); + + org.openide.awt.Mnemonics.setLocalizedText(lblPackage1, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.lblPackage1.text")); // NOI18N + + jCheckBox1.setLabel(org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.jCheckBox1.label")); // NOI18N + jCheckBox1.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + jCheckBox1ActionPerformed(evt); + } + }); + + jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); + jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/resources/long-banner.png"))); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel1, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.text")); // NOI18N + jLabel1.setAlignmentY(0.0F); + jLabel1.setDoubleBuffered(true); + jLabel1.setIconTextGap(0); + jLabel1.setMaximumSize(new java.awt.Dimension(32767, 32767)); + jLabel1.setName(""); // NOI18N + jLabel1.setOpaque(true); + jLabel1.addComponentListener(new java.awt.event.ComponentAdapter() { + public void componentResized(java.awt.event.ComponentEvent evt) { + jLabel1ComponentResized(evt); + } + }); + + jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel2, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.jLabel2.text")); // NOI18N + + jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(jLabel3, org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.jLabel3.text")); // NOI18N + jLabel3.setToolTipText(org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.jLabel3.toolTipText")); // NOI18N + + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addGroup(layout.createSequentialGroup() + .addContainerGap() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) + .addComponent(lblVersion, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lblGroupId, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(lblArtifactId, javax.swing.GroupLayout.DEFAULT_SIZE, 80, Short.MAX_VALUE) + .addComponent(lblPackage, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) + .addComponent(createdFolderLabel) + .addComponent(projectLocationLabel)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(txtArtifactId) + .addComponent(txtGroupId) + .addComponent(txtVersion) + .addComponent(txtPackage) + .addComponent(createdFolderTextField, javax.swing.GroupLayout.Alignment.TRAILING) + .addComponent(projectLocationTextField)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) + .addGroup(layout.createSequentialGroup() + .addComponent(lblPackage1) + .addGap(31, 31, 31)) + .addComponent(browseButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))) + .addGroup(layout.createSequentialGroup() + .addComponent(projectNameLabel) + .addGap(18, 18, 18) + .addComponent(projectNameTextField) + .addGap(84, 84, 84)) + .addGroup(layout.createSequentialGroup() + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jLabel2) + .addComponent(jLabel3) + .addComponent(jCheckBox1)) + .addGap(0, 0, Short.MAX_VALUE))) + .addContainerGap()) + ); + layout.setVerticalGroup( + layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(jLabel2) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(projectNameLabel) + .addComponent(projectNameTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addGap(6, 6, 6) + .addComponent(projectLocationLabel)) + .addGroup(layout.createSequentialGroup() + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(projectLocationTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(browseButton, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)))) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(createdFolderTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(createdFolderLabel)) + .addGap(10, 10, 10) + .addComponent(jLabel3) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(txtArtifactId, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblArtifactId)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(txtGroupId, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addComponent(lblGroupId)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(lblVersion) + .addComponent(txtVersion, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) + .addComponent(lblPackage) + .addComponent(lblPackage1)) + .addComponent(txtPackage, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addGap(18, 18, 18) + .addComponent(jCheckBox1) + .addGap(21, 21, 21)) + ); + + txtVersion.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.txtVersion.AccessibleContext.accessibleName")); // NOI18N + txtGroupId.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.txtGroupId.AccessibleContext.accessibleName")); // NOI18N + txtPackage.getAccessibleContext().setAccessibleName(org.openide.util.NbBundle.getMessage(AsposeMavenBasicPanelVisual.class, "AsposeMavenBasicPanelVisual.txtPackage.AccessibleContext.accessibleName")); // NOI18N + }// //GEN-END:initComponents + + private void browseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browseButtonActionPerformed + String command = evt.getActionCommand(); + if ("BROWSE".equals(command)) { + JFileChooser chooser = new JFileChooser(); + FileUtil.preventFileChooserSymlinkTraversal(chooser, null); + chooser.setDialogTitle("Select Project Location"); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + String path = this.projectLocationTextField.getText(); + if (path.length() > 0) { + File f = new File(path); + if (f.exists()) { + chooser.setSelectedFile(f); + } + } + if (JFileChooser.APPROVE_OPTION == chooser.showOpenDialog(this)) { + File projectDir = chooser.getSelectedFile(); + projectLocationTextField.setText(FileUtil.normalizeFile(projectDir).getAbsolutePath()); + } + panel.fireChangeEvent(); + } + + }//GEN-LAST:event_browseButtonActionPerformed + + private void projectNameTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_projectNameTextFieldActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_projectNameTextFieldActionPerformed + + private void projectLocationTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_projectLocationTextFieldActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_projectLocationTextFieldActionPerformed + + private void createdFolderTextFieldActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_createdFolderTextFieldActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_createdFolderTextFieldActionPerformed + + private void txtArtifactIdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtArtifactIdActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_txtArtifactIdActionPerformed + + private void txtGroupIdActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtGroupIdActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_txtGroupIdActionPerformed + + private void txtPackageActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtPackageActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_txtPackageActionPerformed + + private void txtVersionActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_txtVersionActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_txtVersionActionPerformed + + private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBox1ActionPerformed + // TODO add your handling code here: + }//GEN-LAST:event_jCheckBox1ActionPerformed + private final ImageIcon icon = new ImageIcon(getClass().getResource("/resources/long-banner.png")); + private void jLabel1ComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jLabel1ComponentResized + int labelwidth = jLabel1.getWidth(); + int labelheight = jLabel1.getHeight(); + Image img = icon.getImage(); + jLabel1.setIcon(new ImageIcon(img.getScaledInstance(labelwidth, labelheight, Image.SCALE_FAST))); + }//GEN-LAST:event_jLabel1ComponentResized + + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JButton browseButton; + private javax.swing.JLabel createdFolderLabel; + private javax.swing.JTextField createdFolderTextField; + private javax.swing.JCheckBox jCheckBox1; + private javax.swing.JLabel jLabel1; + private javax.swing.JLabel jLabel2; + private javax.swing.JLabel jLabel3; + private javax.swing.JLabel lblArtifactId; + private javax.swing.JLabel lblGroupId; + private javax.swing.JLabel lblPackage; + private javax.swing.JLabel lblPackage1; + private javax.swing.JLabel lblVersion; + private javax.swing.JLabel projectLocationLabel; + private javax.swing.JTextField projectLocationTextField; + private javax.swing.JLabel projectNameLabel; + private javax.swing.JTextField projectNameTextField; + private javax.swing.JTextField txtArtifactId; + private javax.swing.JTextField txtGroupId; + private javax.swing.JTextField txtPackage; + private javax.swing.JTextField txtVersion; + // End of variables declaration//GEN-END:variables + + @Override + public void addNotify() { + super.addNotify(); + //same problem as in 31086, initial focus on Cancel button + projectNameTextField.requestFocus(); + } + + boolean valid(WizardDescriptor wizardDescriptor) { + + if (projectNameTextField.getText().length() == 0) { + // TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_ERROR_MESSAGE: + wizardDescriptor.putProperty("WizardPanel_errorMessage", + "Project Name is not a valid folder name"); + return false; // Display name not specified + } + File f = FileUtil.normalizeFile(new File(projectLocationTextField.getText()).getAbsoluteFile()); + if (projectLocationTextField.getText().trim().length() == 0 || !f.isDirectory()) { + String message = "Project Folder is not a valid path"; + wizardDescriptor.putProperty("WizardPanel_errorMessage", message); + return false; + } + if (txtVersion.getText().isEmpty()) { + String message = "Version may not be empty"; + wizardDescriptor.putProperty("WizardPanel_errorMessage", message); + return false; + } + if (txtGroupId.getText().isEmpty()) { + String message = "GroupdId may not be empty"; + wizardDescriptor.putProperty("WizardPanel_errorMessage", message); + return false; + } + + final File destFolder = FileUtil.normalizeFile(new File(createdFolderTextField.getText()).getAbsoluteFile()); + + File projLoc = destFolder; + while (projLoc != null && !projLoc.exists()) { + projLoc = projLoc.getParentFile(); + } + if (projLoc == null || !projLoc.canWrite()) { + wizardDescriptor.putProperty("WizardPanel_errorMessage", + "Project Folder cannot be created"); + return false; + } + + if (FileUtil.toFileObject(projLoc) == null) { + String message = "Project Folder is not a valid path"; + wizardDescriptor.putProperty("WizardPanel_errorMessage", message); + return false; + } + + File[] kids = destFolder.listFiles(); + if (destFolder.exists() && kids != null && kids.length > 0) { + // Folder exists and is not empty + wizardDescriptor.putProperty("WizardPanel_errorMessage", + "Project Folder already exists and is not empty"); + return false; + } + + String packageName = txtPackage.getText().trim(); + if (!(packageName.equals("") + || packageName.matches("([\\p{L}_$][\\p{L}\\p{N}_$]*\\.)*[\\p{L}_$][\\p{L}\\p{N}_$]*"))) { + String message = "Package name is invalid"; + wizardDescriptor.putProperty("WizardPanel_errorMessage", message); + return false; + } + + wizardDescriptor.putProperty("WizardPanel_errorMessage", ""); + return true; + } + + void store(WizardDescriptor d) { + String name = projectNameTextField.getText().trim(); + String folder = createdFolderTextField.getText().trim(); + String location = projectLocationTextField.getText().trim(); + + String groupId = txtGroupId.getText().trim(); + MavenSettings.getDefault().setLastArchetypeGroupId(txtGroupId.getText().trim()); + String artifactId = txtArtifactId.getText().trim(); + String version = txtVersion.getText().trim(); + MavenSettings.getDefault().setLastArchetypeVersion(txtVersion.getText().trim()); + String startjupPackage = txtPackage.getText().trim(); + + boolean downloadExamples = jCheckBox1.isSelected(); + + d.putProperty("projdir", new File(folder)); + d.putProperty("projdirName", folder); + d.putProperty("projLocation", location); + d.putProperty("name", name); + + d.putProperty("groupId", groupId); + d.putProperty("artifactId", artifactId); + d.putProperty("version", version); + d.putProperty("package", startjupPackage); + + d.putProperty("downloadExamples", downloadExamples); + + } + + @NbBundle.Messages({"# {0} - project count", "TXT_MavenProjectName=asposemavenproject{0}"}) + void read(WizardDescriptor settings) { + + File projectLocation = (File) settings.getProperty("projdir"); + if (projectLocation == null || projectLocation.getParentFile() == null || !projectLocation.getParentFile().isDirectory()) { + projectLocation = ProjectChooser.getProjectsFolder(); + } else { + projectLocation = projectLocation.getParentFile(); + } + this.projectLocationTextField.setText(projectLocation.getAbsolutePath()); + + String projectName = (String) settings.getProperty("name"); + + if (projectName == null) { + int baseCount = 1; + while ((projectName = validFreeProjectName(projectLocation, TXT_MavenProjectName(baseCount))) == null) { + baseCount++; + } + } + + this.projectNameTextField.setText(projectName); + this.projectNameTextField.selectAll(); + + String gr = (String) settings.getProperty("groupId"); + if (gr != null) { + txtGroupId.setText(gr); + } + String ver = (String) settings.getProperty("version"); + if (ver != null) { + txtVersion.setText(ver); + } + } + + private String validFreeProjectName(File parentFolder, String name) { + File file = new File(parentFolder, name); + return file.exists() ? null : name; + } + + void validate(WizardDescriptor d) throws WizardValidationException { + // nothing to validate + } + + @Override + public void changedUpdate(DocumentEvent e) { + updateTexts(e); + if (this.projectNameTextField.getDocument() == e.getDocument()) { + firePropertyChange(PROP_PROJECT_NAME, null, this.projectNameTextField.getText()); + } + + if (this.txtGroupId.getDocument() == e.getDocument()) { + firePropertyChange(PROP_GROUP_ID, null, this.txtGroupId.getText()); + } + + } + + @Override + public void insertUpdate(DocumentEvent e) { + updateTexts(e); + if (this.projectNameTextField.getDocument() == e.getDocument()) { + firePropertyChange(PROP_PROJECT_NAME, null, this.projectNameTextField.getText()); + } + if (this.txtGroupId.getDocument() == e.getDocument()) { + firePropertyChange(PROP_GROUP_ID, null, this.txtGroupId.getText()); + } + } + + @Override + public void removeUpdate(DocumentEvent e) { + updateTexts(e); + if (this.projectNameTextField.getDocument() == e.getDocument()) { + firePropertyChange(PROP_PROJECT_NAME, null, this.projectNameTextField.getText()); + } + if (this.txtGroupId.getDocument() == e.getDocument()) { + firePropertyChange(PROP_GROUP_ID, null, this.txtGroupId.getText()); + } + } + + private void updateTexts(DocumentEvent e) { + + Document doc = e.getDocument(); + String projectName = projectNameTextField.getText(); + if (doc == txtPackage.getDocument()) { + // Looking for a custom change in package name by the user + txtPackageCustom = txtPackage.getText().trim().length() != 0; + } + if (doc == projectNameTextField.getDocument() || doc == projectLocationTextField.getDocument()) { + // Change in the project name + + String projectFolder = projectLocationTextField.getText(); + txtArtifactId.setText(projectName); + + createdFolderTextField.setText(projectFolder + File.separatorChar + projectName); + + } + if (!txtPackageCustom && (doc == txtGroupId.getDocument() || doc == projectNameTextField.getDocument())) { + txtPackage.getDocument().removeDocumentListener(this); + txtPackage.setText(getPackageName(txtGroupId.getText() + "." + txtArtifactId.getText().replace("-", "."))); //NOI18N + txtPackage.getDocument().addDocumentListener(this); + } + panel.fireChangeEvent(); // Notify that the panel changed + } + + static String getPackageName(String displayName) { + StringBuilder builder = new StringBuilder(); + boolean firstLetter = true; + for (int i = 0; i < displayName.length(); i++) { + char c = displayName.charAt(i); + if ((!firstLetter && Character.isJavaIdentifierPart(c)) + || (firstLetter && Character.isJavaIdentifierStart(c))) { + firstLetter = false; + if (Character.isUpperCase(c)) { + c = Character.toLowerCase(c); + } + builder.append(c); + continue; + } + if (!firstLetter && c == '.') { + firstLetter = true; + builder.append(c); + } + } + String toRet = builder.length() == 0 ? "pkg" : builder.toString(); //NOI18N + return toRet; + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicWizardPanel.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicWizardPanel.java new file mode 100644 index 00000000..28481c96 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenBasicWizardPanel.java @@ -0,0 +1,146 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.aspose.slides.maven; + +import java.awt.Component; +import java.util.HashSet; +import java.util.Set; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import org.openide.WizardDescriptor; +import org.openide.WizardValidationException; +import org.openide.util.HelpCtx; +import org.openide.util.NbBundle; + +/** + * @author Adeel Ilyas + */ +public class AsposeMavenBasicWizardPanel implements WizardDescriptor.Panel, + WizardDescriptor.ValidatingPanel { + + private WizardDescriptor wizardDescriptor; + private AsposeMavenBasicPanelVisual component; + + /** + * + */ + public AsposeMavenBasicWizardPanel() { + } + + /** + * + * @return + */ + @Override + public Component getComponent() { + if (component == null) { + component = new AsposeMavenBasicPanelVisual(this); + component.setName(NbBundle.getMessage(AsposeMavenBasicWizardPanel.class, "LBL_CreateProjectStep")); + } + return component; + } + + /** + * + * @return + */ + @Override + public HelpCtx getHelp() { + // Show no Help button for this panel: + return HelpCtx.DEFAULT_HELP; + + } + + /** + * + * @return + */ + @Override + public boolean isValid() { + getComponent(); + return component.valid(wizardDescriptor); + } + + private final Set listeners = new HashSet(1); // or can use ChangeSupport in NB 6.0 + + /** + * + * @param l + */ + @Override + public final void addChangeListener(ChangeListener l) { + synchronized (listeners) { + listeners.add(l); + } + } + + /** + * + * @param l + */ + @Override + public final void removeChangeListener(ChangeListener l) { + synchronized (listeners) { + listeners.remove(l); + } + } + + /** + * + */ + protected final void fireChangeEvent() { + Set ls; + synchronized (listeners) { + ls = new HashSet<>(listeners); + } + ChangeEvent ev = new ChangeEvent(this); + for (ChangeListener l : ls) { + l.stateChanged(ev); + } + } + + /** + * + * @param settings + */ + @Override + public void readSettings(Object settings) { + + wizardDescriptor = (WizardDescriptor) settings; + component.read(wizardDescriptor); + } + + /** + * + * @param settings + */ + @Override + public void storeSettings(Object settings) { + + WizardDescriptor d = (WizardDescriptor) settings; + component.store(d); + } + + /** + * + * @return + */ + public boolean isFinishPanel() { + return true; + } + + /** + * + * @throws WizardValidationException + */ + @Override + public void validate() throws WizardValidationException { + + getComponent(); + component.validate(wizardDescriptor); + } + +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenProject.zip b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenProject.zip new file mode 100644 index 0000000000000000000000000000000000000000..002b84f0a78ac5d5af7aba6c27f37f81f2c6db8d GIT binary patch literal 1200 zcmWIWW@Zs#U|`^25ScL5owaXMOa~(a!%Sud26mumL4K}YMQ%>(q-g&m3IeV3x9?x{ zvU+B$>BXFg9{yP~c3iCJUhi?dD=4F3@89akuG?>qar67m_{n$1vUT2i>8bh`tunu? znK7Yo;$pF7lXlG$_3saV8d-SG=vLI{#zW5=ujPg9slM;WD7DYUx8n3sYoX-q9lPfq z=9J9$?|f47_DNsd+OU*TnVpM2Rxs&*p53mHQ=z%_a|}0+milr%vHYF~c6?vor~b@8 zaw{};V~-5y@21qsh%JVqtDc`T?~dhaj%vSpP3P9@F3!sn(uDWvUYF*&|CI01wbSN$ zH5x~52So^TRnO(~_1vt?b^4%d;tT({_A58pw~PGBH9O^YB`JH(mt$Tfa}##|`m{{{ zSlgN#t=zUc&oBP_%eO>fHFLygHsN{hHusMwmuo~s9BrHEZpiuZjSRc4#my~TjMw*V zSuvr#aEf3IW9wVNz5Es?PKhrnrZ{a{=K8u_amkjGubozPS!~|Gq<>jB?IUaOkI66l zU){<1zbPa`__*4WDTmIljbA$Nw$$JLOIN(?zU%gGy1V2JcK|T5xPZ~Zz%YBajT@K& zC0KxTaZ$29LPgGOYZMinP!+j}nR!Uco^C=lh!0s=R$^HqlG+()mcooINi8lxQijV& zurjETj7;(jxRRX;)K3af8kz{X7$5?S3=#~P+dj^CZ+(&R`GIY9Aetw2y^eUSmXM7OXDoLDg$j(` oc&iM|M>ZP2(>;-m#_4pJ`7k=bo0Sce0@#316=*^!5Hm0U0K^qj9RL6T literal 0 HcmV?d00001 diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenProjectWizardIterator.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenProjectWizardIterator.java new file mode 100644 index 00000000..e33c7077 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeMavenProjectWizardIterator.java @@ -0,0 +1,399 @@ +package com.aspose.slides.maven; + +import com.aspose.slides.maven.artifacts.Metadata; +import com.aspose.slides.maven.utils.AsposeConstants; +import com.aspose.slides.maven.utils.AsposeJavaAPI; +import com.aspose.slides.maven.utils.AsposeMavenProjectManager; +import static com.aspose.slides.maven.utils.AsposeMavenProjectManager.getAsposeProjectMavenDependencies; +import com.aspose.slides.maven.utils.AsposeSlidesJavaAPI; +import com.aspose.slides.maven.utils.TasksExecutor; +import java.awt.Component; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Set; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +import javax.swing.JComponent; +import javax.swing.event.ChangeListener; +import org.netbeans.api.progress.ProgressHandle; +import org.netbeans.api.project.ProjectManager; +import org.netbeans.api.templates.TemplateRegistration; +import org.netbeans.spi.project.ui.support.ProjectChooser; +import org.netbeans.spi.project.ui.templates.support.Templates; +import org.openide.WizardDescriptor; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.util.Exceptions; +import org.openide.util.NbBundle; +import org.openide.util.NbBundle.Messages; +import org.openide.xml.XMLUtil; +import org.w3c.dom.DOMException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +/** + * @author Adeel Ilyas + */ +@TemplateRegistration( + folder = "Project/Maven2", + displayName = "#Aspose_displayName", + description = "AsposeSlidesMavenDescription.html", + iconBase = "com/aspose/slides/maven/Aspose.png", + position = 1, + content = "AsposeMavenProject.zip") +@Messages("Aspose_displayName=Aspose.Slides Maven Project") + +public class AsposeMavenProjectWizardIterator implements WizardDescriptor.ProgressInstantiatingIterator { + + private int index; + private WizardDescriptor.Panel[] panels; + private WizardDescriptor wiz; + List list = new ArrayList<>(); + + /** + * + */ + public AsposeMavenProjectWizardIterator() { + } + + /** + * + * @return + */ + public static AsposeMavenProjectWizardIterator createIterator() { + return new AsposeMavenProjectWizardIterator(); + } + + private WizardDescriptor.Panel[] createPanels() { + + return new WizardDescriptor.Panel[]{ + new AsposeMavenBasicWizardPanel() + }; + } + + /** + * + * @return + */ + private String[] createSteps() { + return new String[]{ + NbBundle.getMessage(AsposeMavenProjectWizardIterator.class, "LBL_CreateProjectStep"), + }; + } + + /** + * + * @return + * @throws IOException + */ + @Override + public Set instantiate() throws IOException { + throw new AssertionError("instantiate(ProgressHandle) " //NOI18N + + "should have been called"); //NOI18N + } + + /** + * + * @param ph + * @return + * @throws IOException + */ + @Override + public Set instantiate(ProgressHandle ph) throws IOException { + ph.start(); + ph.switchToIndeterminate(); + ph.progress("Processing..."); + final AsposeMavenProjectManager asposeMavenProjectManager = AsposeMavenProjectManager.initialize(wiz); + final AsposeJavaAPI asposeSlidesJavaAPI = AsposeSlidesJavaAPI.initialize(asposeMavenProjectManager); + + boolean isDownloadExamplesSelected = (boolean) wiz.getProperty("downloadExamples"); + + // Downloading Aspose.Slides Java (mvn based) examples... + if (isDownloadExamplesSelected) { + TasksExecutor tasksExecutionDownloadExamples = new TasksExecutor(NbBundle.getMessage(AsposeMavenProjectWizardIterator.class, "AsposeManager.progressExamplesTitle")); + // Downloading Aspose API mvn based examples + tasksExecutionDownloadExamples.addNewTask(asposeMavenProjectManager.createDownloadExamplesTask(asposeSlidesJavaAPI)); + // Execute the tasks + tasksExecutionDownloadExamples.processTasks(); + } + TasksExecutor tasksExecutionRetrieve = new TasksExecutor(NbBundle.getMessage(AsposeMavenProjectWizardIterator.class, "AsposeManager.progressTitle")); + + // Retrieving Aspose.Slides Java Maven artifact... + tasksExecutionRetrieve.addNewTask(asposeMavenProjectManager.retrieveAsposeAPIMavenTask(asposeSlidesJavaAPI)); + + // Execute the tasks + tasksExecutionRetrieve.processTasks(); + + // Creating Maven project + ph.progress(NbBundle.getMessage(AsposeMavenProjectWizardIterator.class, "AsposeManager.projectMessage")); + + Set resultSet = new LinkedHashSet<>(); + + File projectDir = FileUtil.normalizeFile((File) wiz.getProperty("projdir")); + projectDir.mkdirs(); + + FileObject template = Templates.getTemplate(wiz); + FileObject projectRoot = FileUtil.toFileObject(projectDir); + createAsposeMavenProject(template.getInputStream(), projectRoot); + + createStartupPackage(projectRoot); + + resultSet.add(projectRoot); + // Look for nested projects to open as well: + Enumeration e = projectRoot.getFolders(true); + while (e.hasMoreElements()) { + FileObject subfolder = e.nextElement(); + if (ProjectManager.getDefault().isProject(subfolder)) { + resultSet.add(subfolder); + } + } + + File parent = projectDir.getParentFile(); + if (parent != null && parent.exists()) { + ProjectChooser.setProjectsFolder(parent); + } + ph.finish(); + return resultSet; + } + + /** + * + * @param wiz + */ + @Override + public void initialize(WizardDescriptor 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 #. + // TODO if using org.openide.dialogs >= 7.8, can use WizardDescriptor.PROP_*: + jc.putClientProperty("WizardPanel_contentSelectedIndex", i); + // Step name (actually the whole list for reference). + jc.putClientProperty("WizardPanel_contentData", steps); + } + } + } + + /** + * + * @param wiz + */ + @Override + public void uninitialize(WizardDescriptor wiz) { + this.wiz.putProperty("projdir", null); + this.wiz.putProperty("name", null); + this.wiz = null; + panels = null; + } + + /** + * + * @return + */ + @Override + public String name() { + return MessageFormat.format("{0} of {1}", + new Object[]{ + index + 1, panels.length + }); + } + + /** + * + * @return + */ + @Override + public boolean hasNext() { + return index < panels.length - 1; + } + + /** + * + * @return + */ + @Override + public boolean hasPrevious() { + return index > 0; + } + + /** + * + */ + @Override + public void nextPanel() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + index++; + } + + /** + * + */ + @Override + public void previousPanel() { + if (!hasPrevious()) { + throw new NoSuchElementException(); + } + index--; + } + + /** + * + * @return + */ + @Override + public WizardDescriptor.Panel current() { + return panels[index]; + } + + /** + * + * @param l + */ + @Override + public final void addChangeListener(ChangeListener l) { + } + + /** + * + * @param l + */ + @Override + public final void removeChangeListener(ChangeListener l) { + } + + private void createAsposeMavenProject(InputStream source, FileObject projectRoot) throws IOException { + try { + ZipInputStream str = new ZipInputStream(source); + ZipEntry entry; + while ((entry = str.getNextEntry()) != null) { + if (entry.isDirectory()) { + FileUtil.createFolder(projectRoot, entry.getName()); + } else { + FileObject fo = FileUtil.createData(projectRoot, entry.getName()); + if (AsposeConstants.MAVEN_POM_XML.equals(entry.getName())) { + /* + Special handling for maven pom.xml: + 1. Defining / creating project artifacts + 2. Adding latest Aspose.Slides Maven Dependency reference into pom.xml + */ + configureProjectMavenPOM(fo, str); + } else { + writeFile(str, fo); + } + } + } + } finally { + source.close(); + } + } + + private void createStartupPackage(FileObject projectRoot) throws IOException { + String startupPackage = wiz.getProperty("package").toString().replace(".", File.separator); + + FileUtil.createFolder(projectRoot, "src" + File.separator + "main" + File.separator + "java" + File.separator + startupPackage); + } + + private static void writeFile(ZipInputStream str, FileObject fo) throws IOException { + try (OutputStream out = fo.getOutputStream()) { + FileUtil.copy(str, out); + } + } + + private void configureProjectMavenPOM(FileObject fo, ZipInputStream str) throws IOException { + + String groupId = (String) wiz.getProperty("groupId"); + String artifactId = (String) wiz.getProperty("artifactId"); + String version = (String) wiz.getProperty("version"); + + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + FileUtil.copy(str, baos); + Document doc = XMLUtil.parse(new InputSource(new ByteArrayInputStream(baos.toByteArray())), false, false, null, null); + Element root = doc.getDocumentElement(); + Node node = root.getElementsByTagName("groupId").item(0); + node.setTextContent(groupId); + + node = root.getElementsByTagName("artifactId").item(0); + node.setTextContent(artifactId); + + node = root.getElementsByTagName("version").item(0); + node.setTextContent(version); + + updateProjectPom(doc); + + try (OutputStream out = fo.getOutputStream()) { + XMLUtil.write(doc, out, "UTF-8"); + } + } catch (IOException | SAXException | DOMException ex) { + Exceptions.printStackTrace(ex); + writeFile(str, fo); + } + + } + + private void updateProjectPom(Document pomDocument) { + + // Get the root element + Node projectNode = pomDocument.getFirstChild(); + + // Adding Dependencies here + Element dependenciesTag = pomDocument.createElement("dependencies"); + projectNode.appendChild(dependenciesTag); + + for (Metadata dependency : getAsposeProjectMavenDependencies()) { + + addAsposeMavenDependency(pomDocument, dependenciesTag, dependency); + + } + + } + + private void addAsposeMavenDependency(Document doc, Element dependenciesTag, Metadata dependency) { + Element dependencyTag = doc.createElement("dependency"); + dependenciesTag.appendChild(dependencyTag); + + Element groupIdTag = doc.createElement("groupId"); + groupIdTag.appendChild(doc.createTextNode(dependency.getGroupId())); + dependencyTag.appendChild(groupIdTag); + + Element artifactId = doc.createElement("artifactId"); + artifactId.appendChild(doc.createTextNode(dependency.getArtifactId())); + dependencyTag.appendChild(artifactId); + Element version = doc.createElement("version"); + version.appendChild(doc.createTextNode(dependency.getVersioning().getLatest())); + dependencyTag.appendChild(version); + if (dependency.getClassifier() != null) { + Element classifer = doc.createElement("classifier"); + classifer.appendChild(doc.createTextNode(dependency.getClassifier())); + dependencyTag.appendChild(classifer); + } + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeSlidesMavenDescription.html b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeSlidesMavenDescription.html new file mode 100644 index 00000000..9add9e45 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/AsposeSlidesMavenDescription.html @@ -0,0 +1,13 @@ + + + + + + + Aspose.Slides Maven Project wizard creates Maven Project for using Aspose.Slides for Java API within NetBeans IDE.

Aspose.Slides for Java is a unique PowerPoint management component that enables Java applications to read, write and manipulate PowerPoint documents (PPT, PPTX, POS, PPS, POTX, PPSX) PDF, HTML and image file formats without using Microsoft PowerPoint.

Aspose.Slides for Java is the first and only Java component that provides functionality to manage PowerPoint documents within your own applications. As with all Aspose Java components, Aspose.Slides for Java is written in pure Java, incredibly priced and lightning fast.

Aspose.Slides Maven Project wizard fetch and configures the latest Maven dependency reference of Aspose.Slides for Java from the Aspose Cloud Maven Repository.

The wizard also gives you option to download the Code Examples to use Aspose.Slides for Java API.

Once you are finished with this wizard - created Maven project and downloaded Code Examples. Next you can insert those Code Examples to use Aspose.Slides for Java API in your Project from New File -> Java -> Aspose.Slides Code Example

The newly created project and the Code Examples you added is now ready to be enhanced, all required resources and references are also automatically added.

+ + diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/Bundle.properties b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/Bundle.properties new file mode 100644 index 00000000..549d65ae --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/Bundle.properties @@ -0,0 +1,43 @@ +OpenIDE-Module-Name=Aspose.Slides Java (Maven) for NetBeans +LBL_CreateProjectStep=Name and Location +OpenIDE-Module-Display-Category=Base IDE +OpenIDE-Module-Long-Description=\ + Aspose.Slides Maven Project wizard creates Maven Project for using Aspose.Slides for Java API within NetBeans IDE.\ +

Aspose.Slides for Java is a unique PowerPoint management component that enables Java applications to read, write and manipulate PowerPoint documents (PPT, PPTX, POS, PPS, POTX, PPSX) PDF, HTML and image file formats without using Microsoft PowerPoint.\ +

Aspose.Slides for Java is the first and only Java component that provides functionality to manage PowerPoint documents within your own applications. \ + As with all Aspose Java components, Aspose.Slides for Java is written in pure Java, incredibly priced and lightning fast.\ +

Aspose.Slides Maven Project wizard fetch and configures the latest Maven dependency reference of Aspose.Slides for Java from the Aspose Cloud Maven Repository.\ +

The wizard also gives you option to download the Code Examples to use Aspose.Slides for Java API.\ +

Once you are finished with this wizard - created Maven project and downloaded Code Examples. \ + Next you can insert those Code Examples to use Aspose.Slides for Java API in your Project from New File -> Java -> Aspose.Slides Code Example

The newly created project and the Code Examples you added is now ready to be enhanced, all required resources and references are also automatically added.\ +

+OpenIDE-Module-Name=Aspose.Slides Java (Maven) for NetBeans +AsposeMavenPanel.createdFolderLabel.text=Project &Folder: +OpenIDE-Module-Short-Description=This plugins helps you to create Aspose.Slides Maven based project and tryout samples provided by Aspose. +AsposeMavenPanel.jLabelCommonUses.toolTipText= +AsposeMavenBasicPanelVisual.projectLocationLabel.text=Project &Location: +AsposeMavenBasicPanelVisual.browseButton.actionCommand=BROWSE +AsposeMavenBasicPanelVisual.browseButton.text=Br&owse... +AsposeMavenBasicPanelVisual.createdFolderLabel.text=Project &Folder: +AsposeMavenBasicPanelVisual.projectNameLabel.text=Project &Name: +AsposeMavenBasicPanelVisual.lblArtifactId.text=Artifact Id: +AsposeMavenBasicPanelVisual.lblGroupId.text=Group Id: +AsposeMavenBasicPanelVisual.lblVersion.text=Version: +AsposeMavenBasicPanelVisual.txtVersion.text= +AsposeMavenBasicPanelVisual.txtGroupId.AccessibleContext.accessibleName= +AsposeMavenBasicPanelVisual.txtVersion.AccessibleContext.accessibleName= +AsposeMavenBasicPanelVisual.lblPackage.text=Package: +AsposeMavenBasicPanelVisual.txtPackage.AccessibleContext.accessibleName= +AsposeMavenBasicPanelVisual.lblPackage1.text=(Optional) +AsposeMavenBasicPanelVisual.lblArtifactId.toolTipText= +AsposeManager.progressMessage=Retrieving Aspose.Slides for java - Maven Dependency... +AsposeManager.projectMessage=Creating Aspose.Slides maven project... +AsposeManager.progressTitle=Retrieving Latest Maven artifact... +AsposeManager.progressExamplesTitle=Downloading Code Examples... +AsposeManager.downloadExamplesMessage=Downloading Aspose.Slides for java - Example Source Codes... +AsposeMavenBasicPanelVisual.toolTipText=Aspose.Slides for Java API - Helps to create and manipulate Microsoft slides documents. +AsposeMavenBasicPanelVisual.text= +AsposeMavenBasicPanelVisual.jCheckBox1.label=Also Download Code Examples (for using Aspose.Slides for Java) +AsposeMavenBasicPanelVisual.jLabel2.text=Please enter project detail: +AsposeMavenBasicPanelVisual.jLabel3.text=Please enter maven artifact detail: +AsposeMavenBasicPanelVisual.jLabel3.toolTipText= diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/MavenSettings.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/MavenSettings.java new file mode 100644 index 00000000..64b2cd73 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/MavenSettings.java @@ -0,0 +1,74 @@ +package com.aspose.slides.maven; + +import java.util.prefs.Preferences; +import org.openide.util.NbPreferences; + +/** + * + * @author Adeel + */ +public final class MavenSettings { + + private static final String PROP_LAST_ARCHETYPE_GROUPID = "lastArchetypeGroupId"; + private static final String PROP_LAST_ARCHETYPE_VERSION = "lastArchetypeVersion"; + + private Preferences getPreferences() { + return NbPreferences.forModule(MavenSettings.class); + } + + /** + * + * @return + */ + public String getLastArchetypeGroupId() { + return getPreferences().get(PROP_LAST_ARCHETYPE_GROUPID, "com.mycompany"); + } + + /** + * + * @return + */ + public String getLastArchetypeVersion() { + return getPreferences().get(PROP_LAST_ARCHETYPE_VERSION, "1.0-SNAPSHOT"); + } + + /** + * + * @param version + */ + public void setLastArchetypeVersion(String version) { + putProperty(PROP_LAST_ARCHETYPE_VERSION, version); + } + + /** + * + * @param groupId + */ + public void setLastArchetypeGroupId(String groupId) { + putProperty(PROP_LAST_ARCHETYPE_GROUPID, groupId); + } + + private String putProperty(String key, String value) { + String retval = getProperty(key); + if (value != null) { + getPreferences().put(key, value); + } else { + getPreferences().remove(key); + } + return retval; + } + private static final MavenSettings INSTANCE = new MavenSettings(); + + /** + * + * @return + */ + public static MavenSettings getDefault() { + return INSTANCE; + } + + private String getProperty(String key) { + return getPreferences().get(key, null); + } + +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/Metadata.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/Metadata.java new file mode 100644 index 00000000..55f29e0d --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/Metadata.java @@ -0,0 +1,362 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2014.09.26 at 03:01:37 PM PKT +// +package com.aspose.slides.maven.artifacts; + +import javax.xml.bind.annotation.*; +import java.util.ArrayList; +import java.util.List; + +/** + *

+ * Java class for anonymous complex type. + *

+ *

+ * The following schema fragment specifies the expected content contained within + * this class. + *

+ * < + * pre> + * <complexType> <complexContent> <restriction + * base="{http://www.w3.org/2001/XMLSchema}anyType"> <sequence> <element + * name="groupId" type="{http://www.w3.org/2001/XMLSchema}string"/> <element + * name="artifactId" type="{http://www.w3.org/2001/XMLSchema}string"/> + * <element name="version" type="{http://www.w3.org/2001/XMLSchema}string"/> + * <element name="versioning"> <complexType> <complexContent> + * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> + * <sequence> <element name="latest" + * type="{http://www.w3.org/2001/XMLSchema}string"/> <element name="release" + * type="{http://www.w3.org/2001/XMLSchema}string"/> <element + * name="versions"> <complexType> <complexContent> <restriction + * base="{http://www.w3.org/2001/XMLSchema}anyType"> <sequence> <element + * name="version" type="{http://www.w3.org/2001/XMLSchema}string" + * maxOccurs="unbounded" minOccurs="0"/> </sequence> </restriction> + * </complexContent> </complexType> </element> <element + * name="lastUpdated" type="{http://www.w3.org/2001/XMLSchema}long"/> + * </sequence> </restriction> </complexContent> </complexType> + * </element> </sequence> </restriction> </complexContent> + * </complexType> + * + */ +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "", propOrder = { + "groupId", + "artifactId", + "version", + "versioning", + "classifier" +}) +@XmlRootElement(name = "metadata") +public class Metadata { + + /** + * + */ + @XmlElement(required = true) + protected String groupId; + + /** + * + */ + @XmlElement(required = true) + protected String artifactId; + + /** + * + */ + @XmlElement(required = true) + protected String version; + + /** + * + */ + @XmlElement(required = true) + protected Metadata.Versioning versioning; + + /** + * + */ + protected String classifier; + + /** + * Gets the value of the groupId property. + * + * @return possible object is {@link String } + */ + public String getGroupId() { + return groupId; + } + + /** + * Sets the value of the groupId property. + * + * @param value allowed object is {@link String } + */ + public void setGroupId(String value) { + this.groupId = value; + } + + /** + * Gets the value of the artifactId property. + * + * @return possible object is {@link String } + */ + public String getArtifactId() { + return artifactId; + } + + /** + * Sets the value of the artifactId property. + * + * @param value allowed object is {@link String } + */ + public void setArtifactId(String value) { + this.artifactId = value; + } + + /** + * Gets the value of the version property. + * + * @return possible object is {@link String } + */ + public String getVersion() { + return version; + } + + /** + * Sets the value of the version property. + * + * @param value allowed object is {@link String } + */ + public void setVersion(String value) { + this.version = value; + } + + /** + * Gets the value of the versioning property. + * + * @return possible object is {@link Metadata.Versioning } + */ + public Metadata.Versioning getVersioning() { + return versioning; + } + + /** + * Sets the value of the versioning property. + * + * @param value allowed object is {@link Metadata.Versioning } + */ + public void setVersioning(Metadata.Versioning value) { + this.versioning = value; + } + + /** + *

+ * Java class for anonymous complex type. + *

+ *

+ * The following schema fragment specifies the expected content contained + * within this class. + *

+ * < + * pre> + * <complexType> <complexContent> <restriction + * base="{http://www.w3.org/2001/XMLSchema}anyType"> <sequence> + * <element name="latest" + * type="{http://www.w3.org/2001/XMLSchema}string"/> <element + * name="release" type="{http://www.w3.org/2001/XMLSchema}string"/> + * <element name="versions"> <complexType> <complexContent> + * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> + * <sequence> <element name="version" + * type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" + * minOccurs="0"/> </sequence> </restriction> </complexContent> + * </complexType> </element> <element name="lastUpdated" + * type="{http://www.w3.org/2001/XMLSchema}long"/> </sequence> + * </restriction> </complexContent> </complexType> + * + */ + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "", propOrder = { + "latest", + "release", + "versions", + "lastUpdated" + }) + public static class Versioning { + + /** + * + */ + @XmlElement(required = true) + protected String latest; + + /** + * + */ + @XmlElement(required = true) + protected String release; + + /** + * + */ + @XmlElement(required = true) + protected Metadata.Versioning.Versions versions; + + /** + * + */ + protected long lastUpdated; + + /** + * Gets the value of the latest property. + * + * @return possible object is {@link String } + */ + public String getLatest() { + return latest; + } + + /** + * Sets the value of the latest property. + * + * @param value allowed object is {@link String } + */ + public void setLatest(String value) { + this.latest = value; + } + + /** + * Gets the value of the release property. + * + * @return possible object is {@link String } + */ + public String getRelease() { + return release; + } + + /** + * Sets the value of the release property. + * + * @param value allowed object is {@link String } + */ + public void setRelease(String value) { + this.release = value; + } + + /** + * Gets the value of the versions property. + * + * @return possible object is {@link Metadata.Versioning.Versions } + */ + public Metadata.Versioning.Versions getVersions() { + return versions; + } + + /** + * Sets the value of the versions property. + * + * @param value allowed object is {@link Metadata.Versioning.Versions } + */ + public void setVersions(Metadata.Versioning.Versions value) { + this.versions = value; + } + + /** + * Gets the value of the lastUpdated property. + * @return + */ + public long getLastUpdated() { + return lastUpdated; + } + + /** + * Sets the value of the lastUpdated property. + * @param value + */ + public void setLastUpdated(long value) { + this.lastUpdated = value; + } + + /** + *

+ * Java class for anonymous complex type. + *

+ *

+ * The following schema fragment specifies the expected content + * contained within this class. + *

+ * < + * pre> + * <complexType> <complexContent> <restriction + * base="{http://www.w3.org/2001/XMLSchema}anyType"> <sequence> + * <element name="version" + * type="{http://www.w3.org/2001/XMLSchema}string" maxOccurs="unbounded" + * minOccurs="0"/> </sequence> </restriction> </complexContent> + * </complexType> + * + */ + @XmlAccessorType(XmlAccessType.FIELD) + @XmlType(name = "", propOrder = { + "version" + }) + public static class Versions { + + /** + * + */ + protected List version; + + /** + * Gets the value of the version property. + *

+ *

+ * This accessor method returns a reference to the live list, not a + * snapshot. Therefore any modification you make to the returned + * list will be present inside the JAXB object. This is why there is + * not a set method for the version property. + *

+ *

+ * For example, to add a new item, do as follows: + *

+             *    getVersion().add(newItem);
+             * 
+ *

+ *

+ *

+ * Objects of the following type(s) are allowed in the list + * {@link String } + * @return + */ + public List getVersion() { + if (version == null) { + version = new ArrayList(); + } + return this.version; + } + + } + + } + + /** + * Gets the value of the classifier property. + * + * @return possible object is {@link String } + */ + public String getClassifier() { + return classifier; + } + + /** + * Sets the value of the version property. + * + * @param value allowed object is {@link String } + */ + public void setClassifier(String value) { + this.classifier = value; + } + +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/ObjectFactory.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/ObjectFactory.java new file mode 100644 index 00000000..fcff5376 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/ObjectFactory.java @@ -0,0 +1,55 @@ +// +// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 +// See http://java.sun.com/xml/jaxb +// Any modifications to this file will be lost upon recompilation of the source schema. +// Generated on: 2014.09.26 at 03:01:37 PM PKT +// +package com.aspose.slides.maven.artifacts; + +import javax.xml.bind.annotation.XmlRegistry; + +/** + * This object contains factory methods for each Java content interface and Java + * element interface generated in the com.aspose.maven.artifacts package. + *

+ * An ObjectFactory allows you to programatically construct new instances of the + * Java representation for XML content. The Java representation of XML content + * can consist of schema derived interfaces and classes representing the binding + * of schema type definitions, element declarations and model groups. Factory + * methods for each of these are provided in this class. + */ +@XmlRegistry +public class ObjectFactory { + + /** + * Create a new ObjectFactory that can be used to create new instances of + * schema derived classes for package: com.aspose.maven.apis.artifacts + */ + public ObjectFactory() { + } + + /** + * Create an instance of {@link Metadata.Versioning.Versions } + * @return + */ + public Metadata.Versioning.Versions createMetadataVersioningVersions() { + return new Metadata.Versioning.Versions(); + } + + /** + * Create an instance of {@link Metadata } + * @return + */ + public Metadata createMetadata() { + return new Metadata(); + } + + /** + * Create an instance of {@link Metadata.Versioning } + * @return + */ + public Metadata.Versioning createMetadataVersioning() { + return new Metadata.Versioning(); + } + +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/maven-metada.xml b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/maven-metada.xml new file mode 100644 index 00000000..aea2fcb4 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/maven-metada.xml @@ -0,0 +1,17 @@ + + + com.aspose + aspose-slides + 14.5.0 + + 14.8.0 + 14.8.0 + + 14.5.0 + 14.6.0 + 14.7.0 + 14.8.0 + + 20140924084136 + + \ No newline at end of file diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/maven-metadata.xsd b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/maven-metadata.xsd new file mode 100644 index 00000000..6e3d358e --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/artifacts/maven-metadata.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExamplePanel.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExamplePanel.java new file mode 100644 index 00000000..57f19063 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExamplePanel.java @@ -0,0 +1,325 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 1998-2015 Aspose Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.aspose.slides.maven.examples; + +import com.aspose.slides.maven.utils.AbstractTask; +import com.aspose.slides.maven.utils.AsposeConstants; +import com.aspose.slides.maven.utils.AsposeMavenProjectManager; +import com.aspose.slides.maven.utils.AsposeSlidesJavaAPI; +import javax.swing.*; +import javax.swing.tree.TreePath; +import java.awt.*; +import javax.swing.tree.DefaultTreeModel; +import org.netbeans.api.progress.BaseProgressUtils; +import org.openide.WizardDescriptor; +import org.openide.util.Exceptions; +import org.openide.util.NbBundle; + +/** + * Created by Adeel Ilyas on 12/16/2015. + */ +public final class AsposeExamplePanel extends JPanel { + + AsposeExampleWizardPanel panel; + + /** + * Creates new form AsposeExamplePanel + * + * @param panel + */ + public AsposeExamplePanel(AsposeExampleWizardPanel panel) { + initComponents(); + initComponentsUser(); + this.panel = panel; + + } + + private void initComponentsUser() { + + CustomMutableTreeNode top = new CustomMutableTreeNode(""); + + DefaultTreeModel model = (DefaultTreeModel) getExamplesTree().getModel(); + model.setRoot(top); + model.reload(top); + + validateDialog(); + } + + @Override + public String getName() { + return AsposeConstants.API_NAME + " for Java API - Code Examples"; + } + + private void initComponents() { + + jPanel1 = new JPanel(); + jLabel2 = new JLabel(); + componentSelection = new JComboBox(); + + jLabel1 = new JLabel(); + jLabelMessage = new JLabel(); + jLabelMessage.setOpaque(true); + jScrollPane1 = new JScrollPane(); + + examplesTree = new JTree(); + + jPanel1.setBackground(new Color(255, 255, 255)); + jPanel1.setBorder(BorderFactory.createEtchedBorder()); + jPanel1.setForeground(new Color(255, 255, 255)); + + jLabel2.setIcon(icon); // NOI18N + jLabel2.setText(""); + jLabel2.setHorizontalAlignment(SwingConstants.CENTER); + jLabel2.setDoubleBuffered(true); + jLabel2.setOpaque(true); + jLabel2.addComponentListener(new java.awt.event.ComponentAdapter() { + @Override + public void componentResized(java.awt.event.ComponentEvent evt) { + jLabel2ComponentResized(evt); + } + }); + + GroupLayout jPanel1Layout = new GroupLayout(jPanel1); + jPanel1.setLayout(jPanel1Layout); + jPanel1Layout.setHorizontalGroup( + jPanel1Layout.createParallelGroup() + .addComponent(jLabel2, GroupLayout.PREFERRED_SIZE, 390, Short.MAX_VALUE) + ); + jPanel1Layout.setVerticalGroup( + jPanel1Layout.createParallelGroup() + .addGroup(GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() + .addComponent(jLabel2) + .addGap(0, 0, Short.MAX_VALUE)) + ); + componentSelection.setModel(new DefaultComboBoxModel()); + + componentSelection.addPropertyChangeListener(new java.beans.PropertyChangeListener() { + @Override + public void propertyChange(java.beans.PropertyChangeEvent evt) { + componentSelection_Propertychanged(evt); + } + }); + jLabel1.setText(NbBundle.getMessage(AsposeExamplePanel.class, "AsposeExample.jLabel1_text")); + jLabelMessage.setText(""); + examplesTree.addMouseListener(new java.awt.event.MouseAdapter() { + @Override + //public void mouseClicked(java.awt.event.MouseEvent evt) { //here + public void mousePressed(java.awt.event.MouseEvent evt) { + examplesTree_clicked(evt); + } + }); + jScrollPane1.setViewportView(examplesTree); + + GroupLayout layout = new GroupLayout(this); + this.setLayout(layout); + layout.setHorizontalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addComponent(jScrollPane1) + .addGroup(layout.createSequentialGroup() + .addComponent(jLabel1) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(componentSelection, GroupLayout.PREFERRED_SIZE, 198, GroupLayout.PREFERRED_SIZE)) + .addComponent(jLabelMessage, GroupLayout.PREFERRED_SIZE, 361, GroupLayout.PREFERRED_SIZE) + .addComponent(jPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + ); + layout.setVerticalGroup( + layout.createParallelGroup(GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(jPanel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE) + .addComponent(componentSelection, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) + .addComponent(jLabel1, GroupLayout.PREFERRED_SIZE, 23, GroupLayout.PREFERRED_SIZE)) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jScrollPane1, GroupLayout.PREFERRED_SIZE, 229, GroupLayout.PREFERRED_SIZE) + .addPreferredGap(LayoutStyle.ComponentPlacement.RELATED) + .addComponent(jLabelMessage, GroupLayout.PREFERRED_SIZE, 20, GroupLayout.PREFERRED_SIZE)) + ); + } + + + private void jLabel2ComponentResized(java.awt.event.ComponentEvent evt) { + int labelwidth = jLabel2.getWidth(); + int labelheight = jLabel2.getHeight(); + Image img = icon.getImage(); + jLabel2.setIcon(new ImageIcon(img.getScaledInstance(labelwidth, labelheight, Image.SCALE_FAST))); + } + + /** + * + * @return + */ + public String getSelectedProjectRootPath() { + return AsposeMavenProjectManager.getInstance().getProjectDir().getPath(); + } + + void read() { + retrieveAPIDependency(); + retrieveAPIExamples(); + } + + /** + * + * @return + */ + private boolean retrieveAPIDependency() { + getComponentSelection().removeAllItems(); + String versionNo = AsposeMavenProjectManager.getInstance().getDependencyVersionFromPOM(AsposeConstants.API_MAVEN_DEPENDENCY); + if (versionNo == null) { + getComponentSelection().addItem(AsposeConstants.API_DEPENDENCY_NOT_FOUND); + } else { + getComponentSelection().addItem(versionNo); + } + return true; + } + + private void retrieveAPIExamples() { + + final String item = (String) getComponentSelection().getSelectedItem(); + + if (item != null && !item.equals(AsposeConstants.API_DEPENDENCY_NOT_FOUND)) { + + // Downloading Aspose API mvn based examples + AbstractTask downloadExamples = AsposeMavenProjectManager.getInstance().createDownloadExamplesTask(AsposeSlidesJavaAPI.getInstance()); + // Execute the tasks + BaseProgressUtils.showProgressDialogAndRun(downloadExamples, NbBundle.getMessage(AsposeExamplePanel.class, "AsposeManager.updateExamplesMessage")); + + // Populating Aspose API mvn based examples + Runnable popuplateExamples = AsposeMavenProjectManager.getInstance().populateExamplesTask(AsposeSlidesJavaAPI.getInstance(), this); + // Execute the tasks + BaseProgressUtils.showProgressDialogAndRun(popuplateExamples, NbBundle.getMessage(AsposeExamplePanel.class, "AsposeManager.populateExamplesMessage")); + + validateDialog(); + + } + + } + + boolean valid(WizardDescriptor wizardDescriptor) { + + return validateDialog(); + } + + @Override + public void validate() { + + } + + /** + * + * @return + */ + public boolean validateDialog() { + if (isExampleSelected()) { + clearMessage(); + return true; + } + final String item = (String) getComponentSelection().getSelectedItem(); + if (item == null || item.equals(AsposeConstants.API_DEPENDENCY_NOT_FOUND)) { + diplayMessage("Please first add maven dependency of " + AsposeConstants.API_NAME + " for java API", true); + return false; + } else if (!isExampleSelected()) { + diplayMessage(AsposeConstants.ASPOSE_SELECT_EXAMPLE, true); + return false; + } + clearMessage(); + return true; + } + + /** + * + * @return + */ + private boolean isExampleSelected() { + CustomMutableTreeNode comp = (CustomMutableTreeNode) getExamplesTree().getLastSelectedPathComponent(); + if (comp == null) { + return false; + } + try { + + if (!comp.isFolder()) { + return false; + } + } catch (Exception ex) { + Exceptions.printStackTrace(ex); + return false; + } + return true; + } + + /** + * + * @param message + * @param error + */ + public void diplayMessage(String message, boolean error) { + + if (error) { + jLabelMessage.setForeground(Color.RED); + } else { + jLabelMessage.setForeground(Color.GREEN); + } + jLabelMessage.setText(message); + } + + private void clearMessage() { + jLabelMessage.setText(""); + + } + + /** + * + * @param title + * @param message + * @param buttons + * @param icon + * @return + */ + public int showMessage(String title, String message, int buttons, int icon) { + int result = JOptionPane.showConfirmDialog(null, message, title, buttons, icon); + return result; + } + + private void componentSelection_Propertychanged(java.beans.PropertyChangeEvent evt) { + + } + + private void examplesTree_clicked(java.awt.event.MouseEvent evt) { + TreePath path = getExamplesTree().getSelectionPath(); + panel.fireChangeEvent(); + } + + // Variables declaration + private JComboBox componentSelection; + private JTree examplesTree; + private JLabel jLabel1; + private JLabel jLabel2; + private JLabel jLabelMessage; + private JPanel jPanel1; + private JScrollPane jScrollPane1; + private ImageIcon icon = new ImageIcon(getClass().getResource("/resources/long-banner.png")); + // End of variables declaration + + /** + * @return the examplesTree + */ + public JTree getExamplesTree() { + return examplesTree; + } + + /** + * @return the componentSelection + */ + public JComboBox getComponentSelection() { + return componentSelection; + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizard.html b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizard.html new file mode 100644 index 00000000..e2bb0a78 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizard.html @@ -0,0 +1,13 @@ + + + + + + + Aspose.Slides Code Example wizard allows you to insert Code Examples (to use Aspose.Slides for Java API) in your Java Project.

Code Examples demonstrate Aspose.Slides for Java API uses. New Code Examples are coming out all the time!

Available Code Examples are displayed in tree format from where you can select categorically.

Selected Code Examples are added to the selected project along with their sources and required data files.

Newly added Code Examples are ready to be enhanced, all references are automatically added.

+ + diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizardIterator.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizardIterator.java new file mode 100644 index 00000000..f7f8f70c --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizardIterator.java @@ -0,0 +1,184 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.aspose.slides.maven.examples; + +import java.awt.Component; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.NoSuchElementException; +import java.util.Set; +import javax.swing.JComponent; +import javax.swing.event.ChangeListener; +import org.netbeans.api.templates.TemplateRegistration; +import org.openide.WizardDescriptor; +import org.openide.util.NbBundle.Messages; + +/** + * @author Adeel Ilyas + */ +@TemplateRegistration( + folder = "Classes", + displayName = "#AsposeNewFileWizardIterator_displayName", + iconBase = "com/aspose/slides/maven/Aspose.png", + position = 10, + description = "AsposeExampleWizard.html") +@Messages("AsposeNewFileWizardIterator_displayName=Aspose.Slides Code Example") +public final class AsposeExampleWizardIterator implements WizardDescriptor.InstantiatingIterator { + + private int index; + + private WizardDescriptor wizard; + private List> panels; + + private List> getPanels() { + if (panels == null) { + panels = new ArrayList<>(); + + panels.add(new AsposeExampleWizardPanel()); + String[] steps = createSteps(); + + for (int i = 0; i < panels.size(); i++) { + Component c = panels.get(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; + jc.putClientProperty(WizardDescriptor.PROP_CONTENT_SELECTED_INDEX, i); + jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DATA, steps); + jc.putClientProperty(WizardDescriptor.PROP_AUTO_WIZARD_STYLE, true); + jc.putClientProperty(WizardDescriptor.PROP_CONTENT_DISPLAYED, true); + jc.putClientProperty(WizardDescriptor.PROP_CONTENT_NUMBERED, true); + } + } + } + return panels; + } + + /** + * + * @return + * @throws IOException + */ + @Override + public Set instantiate() throws IOException { + // TODO return set of FileObject (or DataObject) you have created + return Collections.emptySet(); + } + + /** + * + * @param wizard + */ + @Override + public void initialize(WizardDescriptor wizard) { + this.wizard = wizard; + } + + /** + * + * @param wizard + */ + @Override + public void uninitialize(WizardDescriptor wizard) { + panels = null; + } + + /** + * + * @return + */ + @Override + public WizardDescriptor.Panel current() { + return getPanels().get(index); + } + + /** + * + * @return + */ + @Override + public String name() { + return index + 1 + ". from " + getPanels().size(); + } + + /** + * + * @return + */ + @Override + public boolean hasNext() { + return index < getPanels().size() - 1; + } + + /** + * + * @return + */ + @Override + public boolean hasPrevious() { + return index > 0; + } + + /** + * + */ + @Override + public void nextPanel() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + index++; + } + + /** + * + */ + @Override + public void previousPanel() { + if (!hasPrevious()) { + throw new NoSuchElementException(); + } + index--; + } + + // If nothing unusual changes in the middle of the wizard, simply: + + /** + * + * @param l + */ + @Override + public void addChangeListener(ChangeListener l) { + } + + /** + * + * @param l + */ + @Override + public void removeChangeListener(ChangeListener l) { + } + + private String[] createSteps() { + String[] beforeSteps = (String[]) wizard.getProperty("WizardPanel_contentData"); + assert beforeSteps != null : "This wizard may only be used embedded in the template wizard"; + String[] res = new String[(beforeSteps.length - 1) + panels.size()]; + for (int i = 0; i < res.length; i++) { + if (i < (beforeSteps.length - 1)) { + res[i] = beforeSteps[i]; + } else { + res[i] = panels.get(i - beforeSteps.length + 1).getComponent().getName(); + } + } + return res; + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizardPanel.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizardPanel.java new file mode 100644 index 00000000..63cab39a --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExampleWizardPanel.java @@ -0,0 +1,201 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.aspose.slides.maven.examples; + +import com.aspose.slides.maven.utils.AsposeConstants; +import com.aspose.slides.maven.utils.AsposeMavenProjectManager; +import com.aspose.slides.maven.utils.AsposeSlidesJavaAPI; +import java.io.File; +import java.io.IOException; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Set; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import org.netbeans.api.project.Project; +import org.netbeans.spi.project.ui.templates.support.Templates; +import org.openide.WizardDescriptor; +import org.openide.util.Exceptions; +import org.openide.util.HelpCtx; +import org.w3c.dom.NodeList; + +/** + * @author Adeel Ilyas + */ +public class AsposeExampleWizardPanel implements WizardDescriptor.Panel { + + private AsposeExamplePanel component; + private static boolean storeSettingsCalled = false; + + /** + * + * @return + */ + @Override + public AsposeExamplePanel getComponent() { + if (component == null) { + component = new AsposeExamplePanel(this); + } + return component; + } + + /** + * + * @return + */ + @Override + public HelpCtx getHelp() { + + return HelpCtx.DEFAULT_HELP; + + } + + /** + * + * @return + */ + @Override + public boolean isValid() { + // Enables Finish / OK /Next button + return component.validateDialog(); + + } + + private final Set listeners = new HashSet<>(1); // or can use ChangeSupport in NB 6.0 + + /** + * + * @param l + */ + @Override + public void addChangeListener(ChangeListener l) { + synchronized (listeners) { + listeners.add(l); + } + } + + /** + * + * @param l + */ + @Override + public 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()) { + it.next().stateChanged(ev); + } + } + + /** + * + * @param wiz + */ + @Override + public void readSettings(WizardDescriptor wiz) { + Project selectedProject = Templates.getProject(wiz); + + File projdir = new File(selectedProject.getProjectDirectory().getPath()); + + wiz.putProperty("projdir", projdir); + AsposeMavenProjectManager asposeMavenProjectManager = AsposeMavenProjectManager.initialize(wiz); + AsposeSlidesJavaAPI.initialize(asposeMavenProjectManager); + component.read(); + } + + /** + * + * @param wiz + */ + @Override + public void storeSettings(WizardDescriptor wiz) { + + boolean cancelled = wiz.getValue() != WizardDescriptor.FINISH_OPTION; + if (!cancelled) { + if (!storeSettingsCalled) { + storeSettingsCalled = true; + createExample(); + } else { + storeSettingsCalled = false; + + } + } + } + + private boolean createExample() { + String projectPath = component.getSelectedProjectRootPath(); + CustomMutableTreeNode comp = getSelectedNode(); + if (comp == null || !comp.isFolder()) { + return false; + } + try { + + String sourceRepositoryExamplePath = comp.getExPath(); + if (sourceRepositoryExamplePath == null) { + return false; + } + String repositorylocation = AsposeSlidesJavaAPI.getInstance().getLocalRepositoryPath(); + String repositoryPOM_XML = repositorylocation + File.separator + "Examples" + File.separator + AsposeConstants.MAVEN_POM_XML; + + NodeList examplesNoneAsposeDependencies = AsposeMavenProjectManager.getInstance().getDependenciesFromPOM(repositoryPOM_XML, AsposeConstants.ASPOSE_GROUP_ID); + + AsposeMavenProjectManager.getInstance().addMavenDependenciesInProject(examplesNoneAsposeDependencies); + + NodeList examplesNoneAsposeRepositories = AsposeMavenProjectManager.getInstance().getRepositoriesFromPOM(repositoryPOM_XML, AsposeConstants.ASPOSE_MAVEN_REPOSITORY); + + AsposeMavenProjectManager.getInstance().addMavenRepositoriesInProject(examplesNoneAsposeRepositories); + + String sourceExamplesUtilsPath = repositorylocation + File.separator + AsposeConstants.EXAMPLES_UTIL; + String destinationExamplesUtilsPath = projectPath + File.separator + sourceExamplesUtilsPath.replace(repositorylocation + File.separator + AsposeConstants.GITHUB_EXAMPLES_SOURCE_LOCATION, AsposeConstants.PROJECT_EXAMPLES_SOURCE_LOCATION); + + String destinationExamplePath = projectPath + File.separator + sourceRepositoryExamplePath.replace(repositorylocation + File.separator + AsposeConstants.GITHUB_EXAMPLES_SOURCE_LOCATION, AsposeConstants.PROJECT_EXAMPLES_SOURCE_LOCATION); + + String destinationResourcePath = projectPath + File.separator + sourceRepositoryExamplePath.replace(repositorylocation + File.separator + AsposeConstants.GITHUB_EXAMPLES_SOURCE_LOCATION, AsposeConstants.PROJECT_EXAMPLES_RESOURCES_LOCATION); + + String sourceRepositoryExampleResourcesPath = sourceRepositoryExamplePath.replace(AsposeConstants.GITHUB_EXAMPLES_SOURCE_LOCATION, AsposeConstants.GITHUB_EXAMPLES_RESOURCES_LOCATION); + + //Copying Example Category + copyExample(sourceRepositoryExamplePath, destinationExamplePath); + + //Copying Example Resoureces + copyExample(sourceRepositoryExampleResourcesPath, destinationResourcePath); + + //Copying Utils.java + AsposeMavenProjectManager.copyDirectory(new File(sourceExamplesUtilsPath + File.separator), new File(destinationExamplesUtilsPath + File.separator)); + + + + } catch (Exception ex) { + return false; + } + return true; + } + + private CustomMutableTreeNode getSelectedNode() { + return (CustomMutableTreeNode) component.getExamplesTree().getLastSelectedPathComponent(); + } + + private void copyExample(String sourcePath, String destinationPath) { + try { + AsposeMavenProjectManager.copyDirectory(sourcePath, destinationPath); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/Bundle.properties b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/Bundle.properties new file mode 100644 index 00000000..e61f0bf2 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/Bundle.properties @@ -0,0 +1,8 @@ +# To change this license header, choose License Headers in Project Properties. +# To change this template file, choose Tools | Templates +# and open the template in the editor. + +AsposeExample.jLabel1_text=Aspose.Slides for Java (version): +AsposeManager.populateExamplesMessage=Populating Aspose.Slides for Java API examples... +AsposeManager.updateExamplesMessage=Updating Aspose.Slides for Java API examples... +AsposeManager.populateExamplesTitle=Populating Example code list... \ No newline at end of file diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/CustomMutableTreeNode.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/CustomMutableTreeNode.java new file mode 100644 index 00000000..2cc73981 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/CustomMutableTreeNode.java @@ -0,0 +1,70 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 1998-2015 Aspose Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.aspose.slides.maven.examples; + +import javax.swing.tree.DefaultMutableTreeNode; + +/** + * + * @author Adeel Ilyas + */ +public final class CustomMutableTreeNode extends DefaultMutableTreeNode { + + private boolean folder; + private String _ExPath; + + /** + * + * @param data + */ + public void setTopTreeNodeText(String data) { + this.userObject = data; + } + + /** + * + * @param data + */ + public CustomMutableTreeNode(String data) { + this.userObject = data; + } + + /** + * @return the _ExPath + */ + public String getExPath() { + return _ExPath; + } + + /** + * @param ExPath the _ExPath to set + */ + public void setExPath(String ExPath) { + this._ExPath = ExPath; + } + + /** + * + * @return + */ + public boolean isFolder() { + return folder; + } + + /** + * + * @param folder + */ + public void setFolder(boolean folder) { + this.folder = folder; + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AbstractTask.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AbstractTask.java new file mode 100644 index 00000000..13147805 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AbstractTask.java @@ -0,0 +1,31 @@ +package com.aspose.slides.maven.utils; + +import org.netbeans.api.progress.aggregate.AggregateProgressFactory; +import org.netbeans.api.progress.aggregate.ProgressContributor; + +/** + * @author Adeel Ilyas + */ +public abstract class AbstractTask extends Thread { + + /** + * + */ + protected ProgressContributor p = null; + + /** + * + * @param id + */ + public AbstractTask(String id) { + p = AggregateProgressFactory.createProgressContributor(id); + } + + /** + * + * @return + */ + public ProgressContributor getProgressContributor() { + return p; + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeConstants.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeConstants.java new file mode 100644 index 00000000..5da9f1bd --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeConstants.java @@ -0,0 +1,144 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 1998-2015 Aspose Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.aspose.slides.maven.utils; + +/* + * @author Adeel Ilyas + */ +import java.io.File; + +/** + * + * @author Adeel + */ +public class AsposeConstants { + + /** + * + */ + public static final String API_NAME = "Aspose.Slides"; + + /** + * + */ + public static final String API_MAVEN_DEPENDENCY = "aspose-slides"; + + /** + * + */ + public static final String API_EXAMPLES_PACKAGE = "com" + File.separator + API_MAVEN_DEPENDENCY.replace("-", File.separator) + File.separator + "examples"; + + /** + * + */ + public static final String GITHUB_EXAMPLES_SOURCE_LOCATION = "Examples" + File.separator + "src" + File.separator + "main" + File.separator + "java" + File.separator + API_EXAMPLES_PACKAGE; + + /** + * + */ + public static final String GITHUB_EXAMPLES_RESOURCES_LOCATION = "Examples" + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + API_EXAMPLES_PACKAGE; + + /** + * + */ + public static final String PROJECT_EXAMPLES_SOURCE_LOCATION = "src" + File.separator + "main" + File.separator + "java" + File.separator + API_EXAMPLES_PACKAGE; + + /** + * + */ + public static final String PROJECT_EXAMPLES_RESOURCES_LOCATION = "src" + File.separator + "main" + File.separator + "resources" + File.separator + API_EXAMPLES_PACKAGE; + + /** + * + */ + public static final String EXAMPLES_UTIL = GITHUB_EXAMPLES_SOURCE_LOCATION + File.separator + "Utils.java"; + + /** + * + */ + public static final String API_DEPENDENCY_NOT_FOUND = "Dependency not found!"; + + /** + * + */ + public static final String MAVEN_POM_XML = "pom.xml"; + + /** + * + */ + public static final String WIZARD_NAME = "Aspose.Slides Maven Project"; + + /** + * + */ + public static final String ASPOSE_SELECT_EXAMPLE = "Please just select one examples category"; + + /** + * + */ + public static final String INTERNET_CONNNECTIVITY_PING_URL = "java.sun.com"; + + /** + * + */ + public static final String ASPOSE_MAVEN_REPOSITORY = "http://maven.aspose.com"; + + /** + * + */ + public static final String ASPOSE_GROUP_ID = "com.aspose"; + + /** + * + */ + public static final String INTERNET_REQUIRED_MSG = "Internet connectivity is not available!\nInternet connectivity is required to retrieve latest Aspose.Slides Maven Artifact"; + + /** + * + */ + public static final String EXAMPLES_INTERNET_REQUIRED_MSG = "Internet connectivity is required to download examples"; + + /** + * + */ + public static final String MAVEN_ARTIFACTS_RETRIEVE_FAIL = "Unknown Error!\nCould not retrieve latest Aspose.Slides Maven Artifact!"; + + /** + * + */ + public static final String EXAMPLES_DOWNLOAD_FAIL = "Unknown Error!\nCould not download Aspose.Slides for Java API example Source codes!"; + + /** + * + */ + public static final String EXAMPLES_NOT_AVAILABLE_MSG = "This component does not have examples yet, We will add examples soon"; + + /** + * + */ + public static final String EXAMPLES_NOT_AVAILABLE_TITLE = "Examples not available"; + + /** + * + */ + public static boolean printingAllowed = false; + + /** + * + * @param message + */ + public static final void println(String message) { + if (printingAllowed) { + System.out.println(message); + } + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeJavaAPI.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeJavaAPI.java new file mode 100644 index 00000000..cb803498 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeJavaAPI.java @@ -0,0 +1,170 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 1998-2015 Aspose Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.aspose.slides.maven.utils; + +import javax.swing.*; +import java.io.File; +import org.netbeans.api.progress.aggregate.ProgressContributor; +import org.openide.util.Exceptions; + +/** + * Created by Adeel on 12/16/2015. + */ +public abstract class AsposeJavaAPI { + + /** + * + * @return + */ + public abstract String get_name(); + + /** + * + * @return + */ + public abstract String get_mavenRepositoryURL(); + + /** + * + * @return + */ + public abstract String get_remoteExamplesRepository(); + + /** + * + * @return + */ + public boolean isExamplesNotAvailable() { + return examplesNotAvailable; + } + + /** + * + */ + public boolean examplesNotAvailable; + + /** + * + * @return + */ + public boolean isExamplesDefinitionAvailable() { + return examplesDefinitionAvailable; + } + + /** + * + */ + public boolean examplesDefinitionAvailable; + + /** + * + */ + public AsposeMavenProjectManager asposeMavenProjectManager; + + /** + * + * @param p + */ + public void checkAndUpdateRepo(ProgressContributor p) { + + if (null == get_remoteExamplesRepository()) { + AsposeMavenProjectManager.showMessage(AsposeConstants.EXAMPLES_NOT_AVAILABLE_TITLE, get_name() + " - " + AsposeConstants.EXAMPLES_NOT_AVAILABLE_MSG, JOptionPane.CLOSED_OPTION, JOptionPane.INFORMATION_MESSAGE); + examplesNotAvailable = true; + examplesDefinitionAvailable = false; + return; + } else { + examplesNotAvailable = false; + } + + if (isExamplesDefinitionsPresent()) { + try { + examplesDefinitionAvailable = true; + syncRepository(p); + p.progress(60); + } catch (Exception e) { + } + } else { + updateRepository(p); + if (isExamplesDefinitionsPresent()) { + examplesDefinitionAvailable = true; + + } + + } + p.progress(70); + } + + /** + * + * @param p + * @return + */ + public boolean downloadExamples(ProgressContributor p) { + try { + checkAndUpdateRepo(p); + } catch (Exception rex) { + Exceptions.printStackTrace(rex); + return false; + } + + return true; + + } + + /** + * + * @param p + */ + public void updateRepository(ProgressContributor p) { + AsposeMavenProjectManager.checkAndCreateFolder(getLocalRepositoryPath()); + + try { + + GitHelper.updateRepository(getLocalRepositoryPath(), get_remoteExamplesRepository()); + p.progress(55); + + } catch (Exception e) { + Exceptions.printStackTrace(e); + } + } + + /** + * + * @param p + */ + public void syncRepository(ProgressContributor p) { + try { + + GitHelper.syncRepository(getLocalRepositoryPath(), get_remoteExamplesRepository()); + p.progress(55); + + } catch (Exception e) { + Exceptions.printStackTrace(e); + } + } + + /** + * + * @return boolean + */ + public boolean isExamplesDefinitionsPresent() { + return new File(getLocalRepositoryPath()).exists(); + } + + /** + * + * @return String + */ + public String getLocalRepositoryPath() { + return asposeMavenProjectManager.getAsposeHomePath() + "GitConsRepos" + File.separator + get_name(); + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeMavenProjectManager.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeMavenProjectManager.java new file mode 100644 index 00000000..f5bf4a25 --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeMavenProjectManager.java @@ -0,0 +1,634 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 1998-2015 Aspose Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.aspose.slides.maven.utils; + +import com.aspose.slides.maven.AsposeMavenProjectWizardIterator; +import com.aspose.slides.maven.artifacts.Metadata; +import com.aspose.slides.maven.artifacts.ObjectFactory; +import com.aspose.slides.maven.examples.AsposeExamplePanel; +import com.aspose.slides.maven.examples.CustomMutableTreeNode; +import org.w3c.dom.Document; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; +import java.util.List; +import javax.swing.*; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.stream.StreamSource; +import javax.xml.xpath.*; +import java.io.*; +import java.net.*; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.Queue; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import javax.xml.bind.JAXBException; +import org.openide.WizardDescriptor; +import org.openide.awt.StatusDisplayer; +import org.openide.filesystems.FileObject; +import org.openide.filesystems.FileUtil; +import org.openide.util.Exceptions; +import org.openide.util.NbBundle; +import org.openide.xml.XMLUtil; +import org.w3c.dom.Node; + +/* +* @author Adeel Ilyas +* Date: 12/21/2015 +* + */ + +/** + * + * @author Adeel + */ + +public class AsposeMavenProjectManager { + + private boolean examplesNotAvailable; + private File projectDir = null; + + /** + * + * @return + */ + public File getProjectDir() { + return projectDir; + } + private boolean examplesDefinitionAvailable; + + /** + * + * @param Url + * @return + * @throws IOException + */ + public String readURLContents(String Url) throws IOException { + URL url = new URL(Url); + URLConnection con = url.openConnection(); + InputStream in = con.getInputStream(); + String encoding = con.getContentEncoding(); + encoding = encoding == null ? "UTF-8" : encoding; + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + byte[] buf = new byte[8192]; + int len = 0; + while ((len = in.read(buf)) != -1) { + baos.write(buf, 0, len); + } + String body = new String(baos.toByteArray(), encoding); + return body; + } + + /** + * + * @param productMavenRepositoryUrl + * @return + */ + public Metadata getProductMavenDependency(String productMavenRepositoryUrl) { + final String mavenMetaDataFileName = "maven-metadata.xml"; + Metadata data = null; + + try { + String productMavenInfo; + productMavenInfo = readURLContents(productMavenRepositoryUrl + mavenMetaDataFileName); + JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class); + Unmarshaller unmarshaller; + unmarshaller = jaxbContext.createUnmarshaller(); + + data = (Metadata) unmarshaller.unmarshal(new StreamSource(new StringReader(productMavenInfo))); + + String remoteArtifactFile = productMavenRepositoryUrl + data.getVersioning().getLatest() + "/" + data.getArtifactId() + "-" + data.getVersioning().getLatest(); + + if (!remoteFileExists(remoteArtifactFile + ".jar")) { + AsposeConstants.println("Not Exists"); + data.setClassifier(getResolveSupportedJDK(remoteArtifactFile)); + } else { + AsposeConstants.println("Exists"); + } + } catch (IOException | JAXBException ex) { + Exceptions.printStackTrace(ex); + data = null; + } + return data; + } + + /** + * + * @param ProductURL + * @return + */ + public String getResolveSupportedJDK(String ProductURL) { + String supportedJDKs[] = {"jdk17", "jdk16", "jdk15", "jdk14", "jdk18"}; + String classifier = null; + for (String jdkCheck : supportedJDKs) { + if (remoteFileExists(ProductURL + "-" + jdkCheck + ".jar")) { + AsposeConstants.println("Exists"); + classifier = jdkCheck; + break; + } else { + AsposeConstants.println("Not Exists"); + } + } + return classifier; + } + + /** + * + * @param URLName + * @return + */ + public boolean remoteFileExists(String URLName) { + try { + HttpURLConnection.setFollowRedirects(false); + // note : you may also need + // HttpURLConnection.setInstanceFollowRedirects(false) + HttpURLConnection con + = (HttpURLConnection) new URL(URLName).openConnection(); + con.setRequestMethod("HEAD"); + return (con.getResponseCode() == HttpURLConnection.HTTP_OK); + } catch (Exception e) { + Exceptions.printStackTrace(e); + return false; + } + } + + /** + * + * @param asposeAPI + * @return + */ + public AbstractTask retrieveAsposeAPIMavenTask(final AsposeJavaAPI asposeAPI) { + return new AbstractTask(NbBundle.getMessage(AsposeMavenProjectWizardIterator.class, "AsposeManager.progressTitle")) { + @Override + public void run() { + String progressMsg = NbBundle.getMessage(AsposeMavenProjectWizardIterator.class, "AsposeManager.progressMessage"); + + p.progress(progressMsg); + StatusDisplayer.getDefault().setStatusText(progressMsg); + + p.start(100); + p.progress(50); + retrieveAsposeMavenDependencies(); + StatusDisplayer.getDefault().setStatusText(progressMsg); + p.progress(100); + p.finish(); + } + }; + } + + /** + * + * @param asposeAPI + * @return + */ + public AbstractTask createDownloadExamplesTask(final AsposeJavaAPI asposeAPI) { + return new AbstractTask(NbBundle.getMessage(AsposeMavenProjectWizardIterator.class, "AsposeManager.progressExamplesTitle")) { + @Override + public void run() { + String downloadExamplesMessage = NbBundle.getMessage(AsposeMavenProjectWizardIterator.class, "AsposeManager.downloadExamplesMessage"); + + p.progress(downloadExamplesMessage); + StatusDisplayer.getDefault().setStatusText(downloadExamplesMessage); + p.start(100); + p.progress(50); + asposeAPI.downloadExamples(p); + p.progress(downloadExamplesMessage); + p.progress(100); + p.finish(); + } + }; + } + + /** + * + * @param asposeAPI + * @param panel + * @return + */ + public Runnable populateExamplesTask(final AsposeJavaAPI asposeAPI, final AsposeExamplePanel panel) { + + return new Runnable() { + @Override + public void run() { + final CustomMutableTreeNode top = new CustomMutableTreeNode(""); + DefaultTreeModel model = (DefaultTreeModel) panel.getExamplesTree().getModel(); + model.setRoot(top); + model.reload(top); + AsposeJavaAPI component = AsposeSlidesJavaAPI.getInstance(); + if (component.isExamplesDefinitionAvailable()) { + populateExamplesTree(component, top, panel); + } + top.setTopTreeNodeText(AsposeConstants.API_NAME); + model.setRoot(top); + model.reload(top); + panel.getExamplesTree().expandPath(new TreePath(top.getPath())); + } + }; + + } + + /** + * + * @return + */ + public boolean retrieveAsposeMavenDependencies() { + try { + getAsposeProjectMavenDependencies().clear(); + AsposeJavaAPI component = AsposeSlidesJavaAPI.getInstance(); + Metadata productMavenDependency = getProductMavenDependency(component.get_mavenRepositoryURL()); + if (productMavenDependency != null) { + getAsposeProjectMavenDependencies().add(productMavenDependency); + } + + } catch (Exception rex) { + Exceptions.printStackTrace(rex); + return false; + } + return !getAsposeProjectMavenDependencies().isEmpty(); + } + + /** + * + * @return + */ + public static boolean isInternetConnected() { + try { + InetAddress address = InetAddress.getByName(AsposeConstants.INTERNET_CONNNECTIVITY_PING_URL); + if (address == null) { + return false; + } + } catch (UnknownHostException e) { + Exceptions.printStackTrace(e); + return false; + } + + return true; + } + + /** + * + * @param title + * @param message + * @param buttons + * @param icon + * @return + */ + public static int showMessage(String title, String message, int buttons, int icon) { + int result = JOptionPane.showConfirmDialog(null, message, title, buttons, icon); + return result; + } + + private Document getXmlDocument(String mavenPomXmlfile) throws ParserConfigurationException, SAXException, IOException { + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + Document pomDocument = docBuilder.parse(mavenPomXmlfile); + + return pomDocument; + } + + /** + * + * @param dependencyName + * @return + */ + public String getDependencyVersionFromPOM(String dependencyName) { + try { + String mavenPomXmlfile = projectDir.getPath() + File.separator + AsposeConstants.MAVEN_POM_XML; + + Document pomDocument = getXmlDocument(mavenPomXmlfile); + + XPathFactory xPathfactory = XPathFactory.newInstance(); + XPath xpath = xPathfactory.newXPath(); + String expression = "//version[ancestor::dependency/artifactId[text()='" + dependencyName + "']]"; + XPathExpression xPathExpr = xpath.compile(expression); + NodeList nl = (NodeList) xPathExpr.evaluate(pomDocument, XPathConstants.NODESET); + + if (nl != null && nl.getLength() > 0) { + return nl.item(0).getTextContent(); + } + } catch (IOException | ParserConfigurationException | SAXException | XPathExpressionException e) { + Exceptions.printStackTrace(e); + } + return null; + } + + /** + * + * @return + */ + public String getAsposeHomePath() { + + return System.getProperty("user.home") + File.separator + "aspose" + File.separator; + + } + + /** + * + * @param sourceLocation + * @param targetLocation + * @throws IOException + */ + public static void copyDirectory(String sourceLocation, String targetLocation) throws IOException { + + checkAndCreateFolder(targetLocation); + copyDirectory(new File(sourceLocation + File.separator), new File(targetLocation + File.separator)); + } + + /** + * + * @param sourceLocation + * @param targetLocation + * @throws IOException + */ + public static void copyDirectory(File sourceLocation, File targetLocation) throws IOException { + if (sourceLocation.isDirectory()) { + if (!targetLocation.exists()) { + targetLocation.mkdir(); + } + + String[] children = sourceLocation.list(); + for (String children1 : children) { + copyDirectory(new File(sourceLocation, children1), new File(targetLocation, children1)); + } + } else { + + OutputStream out; + try (InputStream in = new FileInputStream(sourceLocation)) { + out = new FileOutputStream(targetLocation); + // Copy the bits from instream to outstream + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + } + out.close(); + } + } + + /** + * + * @param folderPath + */ + public static void checkAndCreateFolder(String folderPath) { + File folder = new File(folderPath); + if (!folder.exists()) { + folder.mkdirs(); + } + } + // Singleton instance + private static AsposeMavenProjectManager asposeMavenProjectManager = new AsposeMavenProjectManager(); + + /** + * + * @return + */ + public static AsposeMavenProjectManager getInstance() { + return asposeMavenProjectManager; + } + + /** + * + * @param wiz + * @return + */ + public static AsposeMavenProjectManager initialize(WizardDescriptor wiz) { + asposeMavenProjectManager = new AsposeMavenProjectManager(); + asposeMavenProjectManager.projectDir = FileUtil.normalizeFile((File) wiz.getProperty("projdir")); + return asposeMavenProjectManager; + } + + private AsposeMavenProjectManager() { + } + + /** + * + * @return + */ + public static List getAsposeProjectMavenDependencies() { + return asposeProjectMavenDependencies; + } + + /** + * + */ + public static void clearAsposeProjectMavenDependencies() { + asposeProjectMavenDependencies.clear(); + } + + private static final List asposeProjectMavenDependencies = new ArrayList(); + + /** + * + * @param addTheseDependencies + */ + public void addMavenDependenciesInProject(NodeList addTheseDependencies) { + + String mavenPomXmlfile = projectDir.getPath() + File.separator + AsposeConstants.MAVEN_POM_XML; + + try { + Document pomDocument = getXmlDocument(mavenPomXmlfile); + + Node dependenciesNode = pomDocument.getElementsByTagName("dependencies").item(0); + + if (addTheseDependencies != null && addTheseDependencies.getLength() > 0) { + for (int n = 0; n < addTheseDependencies.getLength(); n++) { + String artifactId = addTheseDependencies.item(n).getFirstChild().getNextSibling().getNextSibling().getNextSibling().getFirstChild().getNodeValue(); + + XPathFactory xPathfactory = XPathFactory.newInstance(); + XPath xpath = xPathfactory.newXPath(); + String expression = "//artifactId[text()='" + artifactId + "']"; + + XPathExpression xPathExpr = xpath.compile(expression); + + Node dependencyAlreadyExist = (Node) xPathExpr.evaluate(pomDocument, XPathConstants.NODE); + + if (dependencyAlreadyExist != null) { + Node dependencies = pomDocument.getElementsByTagName("dependencies").item(0); + dependencies.removeChild(dependencyAlreadyExist.getParentNode()); + } + + Node importedNode = pomDocument.importNode(addTheseDependencies.item(n), true); + dependenciesNode.appendChild(importedNode); + + } + } + removeEmptyLinesfromDOM(pomDocument); + writeToPOM(pomDocument); + + } catch (ParserConfigurationException | SAXException | XPathExpressionException | IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + /** + * + * @param addTheseRepositories + */ + public void addMavenRepositoriesInProject(NodeList addTheseRepositories) { + String mavenPomXmlfile = projectDir.getPath() + File.separator + AsposeConstants.MAVEN_POM_XML; + + try { + Document pomDocument = getXmlDocument(mavenPomXmlfile); + + Node repositoriesNode = pomDocument.getElementsByTagName("repositories").item(0); + + if (addTheseRepositories != null && addTheseRepositories.getLength() > 0) { + for (int n = 0; n < addTheseRepositories.getLength(); n++) { + String repositoryId = addTheseRepositories.item(n).getFirstChild().getNextSibling().getFirstChild().getNodeValue(); + + XPathFactory xPathfactory = XPathFactory.newInstance(); + XPath xpath = xPathfactory.newXPath(); + String expression = "//id[text()='" + repositoryId + "']"; + + XPathExpression xPathExpr = xpath.compile(expression); + + Boolean repositoryAlreadyExist = (Boolean) xPathExpr.evaluate(pomDocument, XPathConstants.BOOLEAN); + + if (!repositoryAlreadyExist) { + Node importedNode = pomDocument.importNode(addTheseRepositories.item(n), true); + repositoriesNode.appendChild(importedNode); + } + + } + } + removeEmptyLinesfromDOM(pomDocument); + writeToPOM(pomDocument); + + } catch (XPathExpressionException | SAXException | ParserConfigurationException | IOException ex) { + Exceptions.printStackTrace(ex); + } + } + + /** + * + * @param pomDocument + * @throws IOException + */ + public void writeToPOM(Document pomDocument) throws IOException { + + FileObject projectRoot = FileUtil.toFileObject(projectDir); + FileObject fo = FileUtil.createData(projectRoot, AsposeConstants.MAVEN_POM_XML); + try (OutputStream out = fo.getOutputStream()) { + XMLUtil.write(pomDocument, out, "UTF-8"); + } + } + + /** + * + * @param mavenPomXmlfile + * @param excludeGroup + * @return + */ + public NodeList getDependenciesFromPOM(String mavenPomXmlfile, String excludeGroup) { + + try { + + Document pomDocument = getXmlDocument(mavenPomXmlfile); + + XPathFactory xPathfactory = XPathFactory.newInstance(); + XPath xpath = xPathfactory.newXPath(); + String expression = "//dependency[child::groupId[text()!='" + excludeGroup + "']]"; + XPathExpression xPathExpr = xpath.compile(expression); + NodeList nl = (NodeList) xPathExpr.evaluate(pomDocument, XPathConstants.NODESET); + if (nl != null && nl.getLength() > 0) { + return nl; + } + } catch (IOException | ParserConfigurationException | SAXException | XPathExpressionException e) { + Exceptions.printStackTrace(e); + } + return null; + } + + /** + * + * @param mavenPomXmlfile + * @param excludeURL + * @return + */ + public NodeList getRepositoriesFromPOM(String mavenPomXmlfile, String excludeURL) { + + try { + + Document pomDocument = getXmlDocument(mavenPomXmlfile); + + XPathFactory xPathfactory = XPathFactory.newInstance(); + XPath xpath = xPathfactory.newXPath(); + String expression = "//repository[child::url[not(starts-with(.,'" + excludeURL + "'))]]"; + XPathExpression xPathExpr = xpath.compile(expression); + NodeList nl = (NodeList) xPathExpr.evaluate(pomDocument, XPathConstants.NODESET); + if (nl != null && nl.getLength() > 0) { + return nl; + } + } catch (IOException | ParserConfigurationException | SAXException | XPathExpressionException e) { + Exceptions.printStackTrace(e); + } + return null; + } + + private void removeEmptyLinesfromDOM(Document doc) throws XPathExpressionException { + XPath xp = XPathFactory.newInstance().newXPath(); + NodeList nl = (NodeList) xp.evaluate("//text()[normalize-space(.)='']", doc, XPathConstants.NODESET); + + for (int i = 0; i < nl.getLength(); ++i) { + Node node = nl.item(i); + node.getParentNode().removeChild(node); + } + } + + /** + * + * @param asposeComponent + * @param top + * @param panel + */ + public void populateExamplesTree(AsposeJavaAPI asposeComponent, CustomMutableTreeNode top, AsposeExamplePanel panel) { + String examplesFullPath = asposeComponent.getLocalRepositoryPath() + File.separator + AsposeConstants.GITHUB_EXAMPLES_SOURCE_LOCATION; + File directory = new File(examplesFullPath); + panel.getExamplesTree().removeAll(); + top.setExPath(examplesFullPath); + Queue queue = new LinkedList<>(); + queue.add(new Object[]{null, directory}); + + while (!queue.isEmpty()) { + Object[] _entry = queue.remove(); + File childFile = ((File) _entry[1]); + CustomMutableTreeNode parentItem = ((CustomMutableTreeNode) _entry[0]); + if (childFile.isDirectory()) { + if (parentItem != null) { + CustomMutableTreeNode child = new CustomMutableTreeNode(FormatExamples.formatTitle(childFile.getName())); + child.setExPath(childFile.getAbsolutePath()); + child.setFolder(true); + parentItem.add(child); + parentItem = child; + } else { + parentItem = top; + } + for (File f : childFile.listFiles()) { + queue.add(new Object[]{parentItem, f}); + } + } else if (childFile.isFile()) { + + String title = FormatExamples.formatTitle(childFile.getName()); + CustomMutableTreeNode child = new CustomMutableTreeNode(title); + child.setFolder(false); + parentItem.add(child); + + } + } + + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeSlidesJavaAPI.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeSlidesJavaAPI.java new file mode 100644 index 00000000..d1d2756e --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeSlidesJavaAPI.java @@ -0,0 +1,78 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 1998-2015 Aspose Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.aspose.slides.maven.utils; + +/* + * @author Adeel Ilyas + * + */ +// Singleton Class + +/** + * + * @author Adeel + */ +public class AsposeSlidesJavaAPI extends AsposeJavaAPI { + + private final String _name = AsposeConstants.API_NAME; + private final String _mavenRepositoryURL = "http://maven.aspose.com/repository/ext-release-local/com/aspose/aspose-slides/"; + private final String _remoteExamplesRepository = "https://github.com/asposeslides/Aspose_Slides_Java"; + + /** + * @return the _name + */ + @Override + public String get_name() { + return _name; + } + + /** + * @return the _mavenRepositoryURL + */ + @Override + public String get_mavenRepositoryURL() { + return _mavenRepositoryURL; + } + + /** + * @return the _remoteExamplesRepository + */ + @Override + public String get_remoteExamplesRepository() { + return _remoteExamplesRepository; + } + + // Singleton instance + private static AsposeJavaAPI asposeSlidesAPI; + + /** + * + * @return + */ + public static AsposeJavaAPI getInstance() { + return asposeSlidesAPI; + } + + /** + * + * @param asposeMavenProjectManager + * @return + */ + public static AsposeJavaAPI initialize(AsposeMavenProjectManager asposeMavenProjectManager) { + asposeSlidesAPI = new AsposeSlidesJavaAPI(); + asposeSlidesAPI.asposeMavenProjectManager = asposeMavenProjectManager; + return asposeSlidesAPI; + } + + private AsposeSlidesJavaAPI() { + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/FormatExamples.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/FormatExamples.java new file mode 100644 index 00000000..7cd2f8cc --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/FormatExamples.java @@ -0,0 +1,33 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 1998-2015 Aspose Pty Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.aspose.slides.maven.utils; + +import org.apache.commons.lang.WordUtils; + +/** + * Created by Adeel Ilyas on 12/16/2015. + */ +public class FormatExamples { + + /** + * + * @param inputStr + * @return + */ + public static String formatTitle(String inputStr) { + String title = inputStr.replaceAll("(_|.java|\\.)", " "); + title = title.replaceAll("([A-Z])", " $1"); + title = WordUtils.capitalize(title); + + return title; + } +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/GitHelper.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/GitHelper.java new file mode 100644 index 00000000..43435a6a --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/GitHelper.java @@ -0,0 +1,76 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.aspose.slides.maven.utils; + +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.internal.storage.file.FileRepository; +import org.eclipse.jgit.lib.Repository; + +import java.io.File; + +/** + * @author Adeel Ilyas + * + */ +public class GitHelper { + + /** + * + * @param localPath + * @param remotePath + * @throws Exception + */ + public static void updateRepository(String localPath, String remotePath) throws Exception { + Repository localRepo; + try { + localRepo = new FileRepository(localPath + "/.git"); + + Git git = new Git(localRepo); + + // First try to clone the repository + try { + Git.cloneRepository().setURI(remotePath).setDirectory(new File(localPath)).call(); + } catch (Exception ex) { + // If clone fails, try to pull the changes + try { + git.pull().call(); + } catch (Exception exPull) { + // Pull also failed. Throw this exception to caller + throw exPull; // throw it + } + } + } catch (Exception ex) { + throw new Exception("Could not download Repository from Github. Error: " + ex.getMessage()); + } + } + + /** + * + * @param localPath + * @param remotePath + * @throws Exception + */ + public static void syncRepository(String localPath, String remotePath) throws Exception { + Repository localRepo; + try { + localRepo = new FileRepository(localPath + "/.git"); + + Git git = new Git(localRepo); + + // Pull the changes + try { + git.pull().call(); + } catch (Exception exPull) { + // If pull failed. Throw this exception to caller + + throw exPull; // throw it + } + + } catch (Exception ex) { + throw new Exception("Could not update Repository from Github. Error: " + ex.getMessage()); + } + } + +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/TasksExecutor.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/TasksExecutor.java new file mode 100644 index 00000000..7fde9c8f --- /dev/null +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/TasksExecutor.java @@ -0,0 +1,78 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package com.aspose.slides.maven.utils; + +import java.util.ArrayList; +import java.util.List; +import org.netbeans.api.progress.aggregate.AggregateProgressFactory; +import org.netbeans.api.progress.aggregate.AggregateProgressHandle; +import org.netbeans.api.progress.aggregate.ProgressContributor; + +/** + * @author Adeel Ilyas + */ +public class TasksExecutor { + + private final List tasks = new ArrayList<>(); + private final String tasksName; + + /** + * + * @param tasksName + */ + public TasksExecutor(String tasksName) { + this.tasksName = tasksName; + + } + + /** + * + * @param task + */ + public void addNewTask(AbstractTask task) { + tasks.add(task); + } + + /** + * Clears added tasks + */ + public void clearTasks() { + tasks.clear(); + } + + /** + * + * @return boolean + */ + public boolean areThereTasks() { + return !tasks.isEmpty(); + } + + /** + * Executes Added Abstract Tasks + */ + public void processTasks() { + ProgressContributor cps[] = new ProgressContributor[tasks.size()]; + int i = 0; + for (AbstractTask task : tasks) { + cps[i] = task.getProgressContributor(); + i++; + + } + + AggregateProgressHandle aph = AggregateProgressFactory.createHandle(tasksName, cps, null, null); + aph.start(); + + for (AbstractTask task : tasks) { + task.start(); + try { + task.join(); + } catch (InterruptedException ie) { + } + } + } + +} diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/resources/long-banner.png b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/resources/long-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..821b3197f92d91a6af52742f83c007a4333af21e GIT binary patch literal 47286 zcmaI7d0bN4*FRoanK@8WSr?T`lkU|t^M(Tox3tt!xn-qZ=P4_}Ih+79O*98eZ)q3N z%*xDEh@3|RB`c@YL>zI#0TmnphrZnB`+T0??~mW};{}|vH+!wU&OYm`z1DjzlK!-_ zRNVi|{vA7ZC|X-tT;H){=Zf_F&wYEP--|kg7U^MU=yl7BJ4)JBXQYkYeiv*n?ASpi z%5Qq^k+$W6teir3>`-F<``P(STL~oXJQjAzG0Z;jc38M)i0_UIK7n4o$F0$xe!kaz zJ$)jBTYXJ;?2ysCd&4oz(bmSqI}okw`R^Fr2y~E?ddCh^L`0CMx4&=LaW7xLy8&h= z7i$_$9>42jcGBUz?OEF(bKg66t)fDF?W62&ct`nr8~dC@z>k|om`E9*eZxGDN1#yw zp(YV#C;yADiS+#6ZoQMo|7%E?zuC$EE0m+{pU2GuLwt{)*EKlfeO6!pI25X@|ND6; zRA1-#xwHD`^v+7(&@=kKo1BN5oHIQB->;L>*+P77n_RcJ{NHm)TV^NkgoOo}=;?)r zhwFwL=mv)P>FFCA8~@AW+_^K-5obap1HwEb&IE*N{D*^uZ>V?3-Jr0$fdR+=<>=`Z zct6bSq*T)XdkN^E|6v;t`rpeWT`;`}&mcX0-LwB*(tifp+W!9!MWg>`bZFRh-~UJ6 z|4+uDHzI?4^{)Gd2Hp?xmfpDA8vjleWMUrT>lqdpaw9Mh^`BMz^G;w`VCbE|pyTHD z(Br3VJ-zP+{M+&Ce^J=lnpg*fhIs~f`&wI=os{y>y?fWk|>d(KY|D(9l z#{a0kZ-7+aL!^rRZQ{ZA9Xmd)SzBDV5#ctmC7bPM8LW$6f8BQB`)@B3H8m}s@7A(P z%toU^!k8X$jIyLO5BKpfa!F}uQw!8+N6T)Y4YYN)jF!g3Ka@`ww9#NN*z(%?H`A*# zcQB_kg$=nIkymHU?pGJ(;NMpx*Nq!~2PV66ex5oOj(fKp*Jb*5+vX;Apv>RFnReTj zl#>$x1Om;snwpw+;`lMAO?jIlV0HCl!yie@Lp9+QxQ#VM9=({gI@ecGSXd|%k&%&M zPC9yT>nQB{z?k{k;s~NgJM3I}oY`7ejL6u%)y{P3mw+^icV_vtPe4F`0073*yP*aK z2BI7MUu3L7{Wal>qvkExzbBp!y}wzs7uS(vhF+cRm6dqPkm^D)ocFG)D#YpuP4r5C zf4>ZTOb)3pVBAFTzg@-5K(@voW`v@t2AO@u&f$&jxhV0wtL{@AHX+R~q(dEXGz{+F zS7J6w1bF6?)wVg`Zbrbu7fc@%=O_+~PILd9$MD(u(>{Sj^v7jubw+Hx^zzC*83{70 z6f2P?Q2-4XjMza!jy(lnuoL>V73hH3ykP<32hsVi`&#(*Ni;w;EuaL@X`0{%f6_}i0P{e zf;7{m&v~hM=0QsZlN=+Gzi3)pNKfl{=HO<$5=X=y9htahBePiI-aDUWGW#yCeu>_k z-KttU`@V?NWeGMDxj2iCS_U^kd7chR*nKg$kIj}Tt=_4nl16C9M0(xa>Cm~y+9h{b zs-fRrf=Wfmtq$F|wVzp5=k)&!W4#AvSe*R$pr`!3L*aez+Rs;bvf~HzjXw&itynCb zgkHS}RExy1=cW>WpN*){&wN@FPL-E6G0t)g10tfDG3q5@RM=nd9;)SfXmcA&yeyG& zYiv72S4JHBCMx;DJi(}x-Ckx~{qCVFE;~cy!%Zd{AJu_+yd9{M3U{#rO$5BOP|{xmg-^$Rc+VP2Wj$wm@trCWv_VLMZJtl3;w=pzbxZW zE68SGKD9i)i5ug}kbK%HMI;Z=Y1F=ym1GsLAs|Q_j7}RHEmf0U4Y8Sl(d-SO3Io5An2OJ?c5m_l)Ny~9Fn!IC;aY+}_ zipR5%l*81UnI zo&PXFP*=b$wI*1Vio0^NnULB(oxrf$RT9yitLigQIn}-Jp#WA0LXaL^jpsf>Lh}Wl zEcc--!=Eb}kdRZiE|HobnDe)yT9QWCoEzz;nqAX?UUC(yj;g zSSE*5oN^5sfMuUb_~KW+!L|Tu!wmN%(Xn)hi|4zJz2wT(*0j{D$=!?pummT1W!G*j zA{D5h0FP~VcITd#R*n|C-Wz3#rgz=fm5VQ_m#EnwvKkxn)_^#jyP-Ei4yxKHyqCN5 z9iT7#?$=xtr5VL}1w2Zz+I+TRFJxarf&$XG=I6BN8qfS!L^n_ott@sLvpupmj_h(% zscRevvqX2%*ewN1T?@Oo4a!j1_G?ZTi@hS+J@Ck?W9&#k8CV(i$aVF^5k>f2(6SN+ zs!^^jex1waK52HphSd38;xH|={t#w~4rBMqLR)ve=Fe?KyjPGN6bstCoW%<8M*uMT z$RG6#uK_gsySTb!nl9B;3k1Kc8G=bVoU2p5q!O?n#5NLiT`tvEz*einu|Y3c5NbPT zx*8V&jA->1IkIQQY!&#UO`jI1EYJ}?s&+rv2&%PZ#A6szn|g@wPp622m2sC`3N6Wm zr-!7*S@XW8siWYJx8>kikLe5~U+|Vu9xFWPjm@6Row#j5%C^I#3E02NV2C4H4VV`I z@b(q2UO@EL_uhG@DGj~Z=EbBJ#OvM<9+ldvfsf8whm?Mnqdpzq3&yn7If`LpUl3J* z#ls`!BU^cZvf@&#FR4awQF|(6zQX<1@Gn0Xzf4TEp?jVD%I+g^_xvqY^%c_o?)}uI z_zCK@%K>H`PVoQJ3Om;oZMgTTfR}$K&K9z_djix4b9j#w-N=31rUmz|nT}VJgQh&= zPtSy=pdXStXQ#F9QT8F=bgiXkU6Yumgg~R$#j_R&`W5%~RUqtsS6NbQJTfA~7&&u|>2KHuzZcS|6!KS-ooIZPJu4|o1 zOWFzE1&U$QmwhtU?V8WrGS-KW+42P*EXbnYZSLWs@-G9xet}zL#XwcIy)vrSbDX^1 zqm6N!Y9xVOo^$$?#&8?Lt z9UDuOxtwPpAYubS~|3v>g6GAzA6$t{-jtyc@J?L5bI)3(fr!-0U|n+~o+tEb>0zxB1` z64Qk&7<^c};Hz~=Zk6tji4%*3BOd0tTZ=yfGJo9DN*CVUJ_-u%likt4~?O8cc6A~dRX2z=L3QE}h@iZskR?ns;yq>S4z})o? zF7_mu?j;Eh%G97PM=Zx4<3AHg8_}oO{aHE>j~Kjy2PfZ5dq}n=`f%ghWc?o1ITEnT zzf!Anri}!_hb-IV$gWTW>SIfUNVRc6-%)k$tvZUTTq|z;obW~05O8Dzb-9<|I`rq6 z?f!2~1VBmq>Q@M+@)jz)f9WcgOFk-kmuVk45myt+7O)k!*dI0$6r6{H+OZ0OQ31Oj zrutFZND~8>pV=k^&Yk<_e-ld%au6blLU6zqwIyid!Ff@QQiyAn$`J zOg?!SiV)OTueq)qtC?FJnOk!Wx-hUlsaKJdWBPFo)<7$c`9V_}1-2R*VdD;G-{YM; zC${FyburI+(2t+T#{~)!>A!n+>(#t>_&NPLnaud` zHtQoX)e%h)<5)T*`6HCQ2`s|klZZoXSwlx7foHN|VeOfwDvTihDqs;6bwBh2+v~ht z`)aKDP><&_9SBvz{_U}x^oN{8S#R(b5!^3g7~VlX|th$6GGoLzbWDf7b((6l$37k;0^#FhnR21GR*Qv6Er} za8yRdFGZ>6NN!WerNrFS+FS*UcxB^OmHU(iVQH7MLP)x3>7EP>_odFuCisiv?eRA? z+8Y-u+=>?~G4?XY+DTLhg13FnF{^WUyM`Z_ojEKo6z(wt5 z73e6gJYkKR8*&!D0vhPFwGnm&pAWLowXp&gaQqF~t=61%tY96bBF{r=4(L8`A?wGKwBgZXy z{f!>Wv1DU8B+47SdKRtD_vBUoxFvpq5~0L`-Xn0M-7u03^uivnY8h7s2HFdAJWNtk zQ$npJJ-ah5Gw|wLCUTOIsit-tYKNCFWeK&fZHY+AjD@qvNB6N@c|H2Z5(9~lbZh;n zax*=wjNU9;?vfp*cyK-m`W&Fc)pAP?EIWl>Ru$ay7789u-aK9P^sC}QlnHqAVXC=E z0HHJ=Lq+;P_6l$1K0bpyD@u+f53*HfxU}~hjq6Y=>~ENmS8g?_-2~psBraU9Ado+& z7ad$FW;_LucGj%tBO;RM|EPi4A)bK;Ac(DZ-C6{rNv-{E*xAcU&gukEJ^kZnFXZ=E zFV&Zxl+UhoH=s#kx@N}I+r-ybv##Hl`Qtj6Jdyq3_0?As3S(ncBU_wr))2)=;Zn_o z6LgK4ija4hS;hF8->k!Jf*0&MM+Kfl1UZ*(_>Ot$<$?Ky6@_!wh%Uy?Bd%`RQ0pAg zC8-rx24l2u&*?07W&Fj#7& z^NPaTE%lGgPSe}j)X)?DhQ#*(6na+p5(wYyzdJr>np`Vyh84Ybhf>FZs3uGBGot_F z(q$KSz6aM1(%#>Ao8>@y^w=?Mw1q$xiB3D+D3khGLdM(WSl$~XCg~o!W(Q`S z8gvux<->C0b{xskfF+*-W4PvkK$9AsC+#%jJs^lYL=~O%43NebJOyGRPW=daG(UL$ zE5TLNnIY@QH+`|x`q1{niQVN<^Nh>gRf2)~ZxDDT%ko3eGt@79(Uk3=F4C#H(3PX!M(UNNba1=h@t?{c(O2q?3+QN5(o)jXYzYtElTfS@4Y zwPOp+=i*V+u7AR$LGuN(jZaNUD7E5Q;Zy13{A#&~&+ywSe#+83}+*|)d z*-!Q(!=a{^@WFlH>(n@h)gW&cq*k2e-P_)L=~J&`s!Gi?f7%;9ldKMVm8&x$l*<)0 z(kM(zg_dKo7)|P5XVZafCzQBHzpz&9lW}ypiVb z>ZJmYC%OdoTfG%6^(r>yCHLii6piNp58;*WFmMU)i+W{^J$&W*NomY~?ci5??9z^N+ z5e#EM*p}1dUlw*O4uj$R6@zcQ9K(miUCs!u>#~e9K1eBdLLZwB#12}GHl}^nsL`l) zol3!DE7N>bf#z-bM+eU`2{EFh+S#Jd!tXl2v|2!@F~&|eCCj#R>qY1iaOU$t-Q}%| zgZN;7SoDrJc+B16?dPXt40Y3CM|SSliFy|79Cm$Gbj&6x$?9+VQu?=x;Kl%>9v1v) z#4)2+XQEznZo+%*>R!RoX%b{zEVIMM@TtPb+5^CEZ%gWylIoSqlTNm<>Bl)u8BDu6 zY7$YhV$gD1rS?4wf{`eeJK9Ltm-;R@{VH#ToxOcSd}Fv*ciZP1Wb6B6rEYdt@DFu9 zyUVlYv^7OIm4Alao95noDdI`hD)-G7E8{n@zqogDXDyn)K)Pa1Qf5m~x=T(BZVJ~7~8R!`MF8>LrzakIOU8x4Ma#klR~WdV@I$c_Vp z1L$1jSbk^R{AaxgVUk)NQOvY#Z7E7EDdBV_QA2~D+%udSua$HjHi@P0g_4nzYA}_o z<`*||J^UD5&q+FaZcW-#i(IEp##HiGtV?U9A+?CYU>TcXZ!LLdX2;8bqjGLZ4F=-` zyZ_LkZ3_^neCj>iV>b!lqF1%(G?j0gjfzW^`5BAM<>5Qc5ftSj4bwhZSl`2_OLZnk zMU8%hOz3JvWrAv1A>qZIXCph6z8ceGi5f7hvVQ~t09&;m>Uewc6L;4@Tf#QG5CDa9 z1hMngQ~9NjQvsWvz{Pt1=YeN~{Vabgw|!g}YMO*k&p=%lup3LUDZ!#?nFNUkEgUYG zf%ESz7+glNIj?(Q$b}iMM`|3y&TK%xJfb)`;;ublAT?e?VO8>W!!#~)pr1|$m3WQc z@44kY`L$%}TE{KCl1Dgv^8?+BexWYg0gnAd%K$|lGEcpkw>&A6iJokfeM|cLM9zs& z!)rQz$(in5aA7y18?)UEE>Eo~@n@OM)|QK3AOkGT#IS*XywmOg12>6llf2rO^ILNb zAnfz!3(oGEXO&$aPVYBU#_{vrycC;k4=&amy|Gq?yuR@PZP?qs;~?;~jE&9FxZCGC z6}5(%EflI@FqK2W*CrOs-gtGdejVwmic+qL6W^%unCsKWXbwv8mYEhfXH4Vvn$#qF zh1m7!u5*EW(dik#6x-~gzJ-&=HYnctK6ZDC^bcUdRCToY!Bz+ggPwIT;{0A^a5+DS zn}Ju>hHV|dB%NTNU6C6QEeGe|*{AA7l(?@@HkLi=>1N#YCsOA$UziWXh$yxQ0h`k1 zRd5C?qJ-M@wJU+&c#X@%hz^CXcO8M39IS8e9e?tOjFfoFsuWaH#tX@I9s)W^4P47$ zJ(L4Mwhq*;0%&eD3WHF$EU^B-HD|Y4Vw*?+=i~|vr50T{-?MZM6xYk-JOB)MBm>H` zBmSC@0Uhy#+^!w>&QC&0=rAk_o5pF9g+A5WK1(~1^bBGB;W5O9I;#RbC_^U_>-$?Z z!0g$O&{w1R2#kbq40UuVe~2@^e3atot_`ou_X1p)Il?O+HkW>r zg<(hg9L1lL3PLSanLsd3kWX@s^gV(XeXiJ^Y}P&|ar{dd@M`5(cD;lU!+~O#ywR)1 z>vvh(LnEKOe~tnMg7u<;VQUUC`D#CrF#|u$mSs2g*A~oU#qMRUDlUV$GaEDM8x@x{ z6Zcg=UgjJjcV;-Yif+Z%F}0PgZp{{~6>PVN4yuRp@7!0`|}>u$*G5p zSItcEe9wc`Q9RB*GiplYUJdwI>FR5*?l_fP4@*Bk{munb__1WFn^@5OHfQ106$BTE z;%WEqaW(@rUwVT}kv{k^PfO9eaCH>VX){jEY^#N!mMhJcI8Mg56Ug3JFBahpdG~ zH%ikMe6&`p9E@a%9hEd5A?M=7o&C)POL9;(2h7sA=^Vgy_?zWcvNpRt&bEU4Sp&Sb ze^7A5pWg&oCJ^fYQ^{4l+>5{^~7F@|sS=!tu**1&kV00PT0hd1?!2kt( zl4(8Saz?rEM%|IvUayNl>sXaw^+I&orlx4>aWW@9L1Sir7huTee6YfmXF>0<3O1Dj zxm$IN*R-d=>MYwo!tYWJ%~KNbWKul6`!c}^w@>P;-LsQJRJVRfYlmRyTEbS*DBnut z0B$0x*REtdvd4vCI1KvOt26M{^(+94Jv$Skk}K!}#J1Tv^Ifc}Mj2;n5A)J=zl)|V z`Mb+&Sp>BbdfHGH(u+u}I*_ZAD5S&STo3(y7zsU2(b`Vus9-EZcx8AW_-I78&{N7w znj@+W4pkq%D&MJScs7FLIi5l4^YAy&*+FH)e|(y;-bPAPP=lepRXu zwd`{lYWx_f`C}r7oYe$LmKY%fWLS$XcEwzp&xxGSNJCxD8Em>>CmyG#Y2Lz&F+iB% zQbj0tyrRANixihVA(l>zul#Ht5q(iXYJ46QyMBn^nMK_XnKbj;1?xKmMte2082f7k zt%DO9y0zjv-kJE1##(zt5sbkT#I5Nqp}$F>k>nep=i45aZ+qCo73vY;DD0B@S{4Ay z!`6eoS;XW2Ymx$VjVDkr4bUXvq>pRjq6!BkibJ}kDst!X7 z7zXjn4W~*`6LjOTLxp0vQ9XLI9(*r3W6O&)N9wa_keT)2Sj7A@ivfkNwB5$|!In~B zpIT`hztk^H5+(pz%C;`ASFHlBkasGlT4H~EU>O-458sQd-ps0^7B>xrh=$%_Syw>3dM4CRbgzp-gz z)^U_)GO5${hH^=JJ}oo_83sL{DJ;Z1t`BZ)Q?P4sXdOGF;*C;PK+hiDo@HKytbBpM z)5cN(F%OQVHeW6 zge-?Ts!A#J6!qhHocX5s4$uH$G92d<+M4!BnEW&`yGQF8gY{{Bd-}4b9;PH)}biuUtQBJOju%WDI#-P>9G; zRq)YOlF5=wPkKG1IX)LKXbd|!ypo?*LP=83(M@FEB-vJe(qI=>+ar)V9bg~_hC4* z`I{vu;I)@!-`-5L6icfNlsfmZ}JQznWfcstVTRSVXwad`X;#pQ;x`iEZR)z}CDK<)sM5O&jVn zE#<%%sheX7(!p)?JFLO8Pv5$a-G}e5Ek1)~J_eXkzg!hj#xstxjSX8g4Ubb8Qk-#q zrthHJ)J18yg8guY0@NnEPARzNn8qfzIV*FIz&W&%CM(2Ym^4_`xJ)`-7`d_=snUJc zZHPdID;H%`x)D;FTI#PN4R;N(%pIgNU}5y5SfVl zM8A7Qa?V!9{A}N*eN4#D5Rwx=T$jA*g}mJmh>lj-xP&n7z16l}kX9JDn2@INwDwup z$=F?`_bV)H5^eVHs+iSORn^XY)*hOFp~FHy&*e}A=|)%cMR3dOtGdd-hYfNU*v8?S zGxnZy`^@W_X(M*W= zt{*69n`%KKTGd>tkyXo5=+8+YOe6Zo66?Pcp_Nyr^5;$m`(4O(LkyLxQH#-LIRAnB z!zJbO7y8PJz)?;ETMy>Z+W|Q45be`lAx)sHDtH>LuL+PaV}}|GHsS%WwTSV2wM9W5 zkd2*a{^vNdy*K&r;smqLzihzf-UsuAs5DRQ$X!ZMZZ}yL9;P~&HD0QT5HR-+tQI5C zlrbQx8Z);u+IS3XYKfighM?eHZKg>87`126pW#F&BbSrs0HggbZR#t4x%g(b4X>~!U#}HvI>37?cDkXAx4HG>~ zAKu^t7Q_U55$U`lI$aq4du;HRJ*QQ457n}>rqd#PE_f1XCv~&53gF5zU}XdkHBBY9 zBVlS#1@vQ=mb8VV(lmj8X@u8PSXA51c5lBEpZEN=(S<4JG zOxf4rh?^TN1A2k5hT598dDmY8BQ|w9S5|=VkX*-p?))#o0kP1Z+PR0ul~H=R)fh1| z7vLg7F(1gl5WZg^q=%ano}QuPVV=OVpzZPj@bZ-fPwlf!grQDkpTB8KqWe;#?wq$s zpsz*OYUfhrp{9U+^n~P^&{Nd!bq*!D9xO|{Z_ZmS?bQ~g*v)q~aH~WW6lP3Ne_tB= z=&s{0KTl29|GrQcvh8*oTv8f91Rx^gSp;%fHgakg>BFP;)Pdf*5!)eMxD2LZT%%*Q zO@=zw7%19o)cd)lSGuV#xm!@C$RitSS~Wf<7IlE@->9v#S>l_9+xs5!`!kvxq z#XA{&E=#A~^Ny?zfBSlJOn~dHeDI zVppKjU544`0>{R8A#=|!WOs`x-pEo?^|tn+2MFf4p_|-D|JcOHy#Qr_FkD`&(y9o%y{gcTjcLZdk`vxcfDPOMKjxP_+E1v66 z^XGWgEV=fT%e&oo8W8uI%}+DZ?m|{TV&F#E;$ba(6*TyfY{go>?QmkKDf4}ftC1kw zw)u8q8E@FQhMC!%TUS4u4O(Jv{6eX54bb^;u(fVEr6{zV@wR);m4R)7816bxrUK3jtu` z-^+~@g4vylm%rq}4;l9NZMEXJ+SjEz2xXOdOQy;vTZ#Ul23`$kwkErGt@dg=q2St>5uI6|M+qyJuOoaH#LzlP>s)! z>GpYIW1Tvk5g(@^mm3xEps23(o=5LjLbc9ytt^wR7e=VKOAq}7GfBsCV*Q*qUe%B^ zgj}STWlvJ~B_(@O#E@r#>@~20s_PEXZ(1**+gc6DBfGy%9C99G_8!y)MePn`7l!^m zt`%J&>4BNWihog`xT&%w|kO|vDvh6H=LIW zpLqavU-D|)RqQjEO&~6hJ|gN{AtXKpIn&x0fvPlq;i1xjr)t~u#@qKo&7k~o89n)5 z%#!DK!iUSH$4l?YWwGNhK4YM0hR-pmhy7Sy}V*_02(*)ZQZ@T z0>|~u{8a3ojjk}8nZSIPW_SX@FY^1RJs|7!?$Rg|ShZLU9%1s>oRscJqpBw6@d$S^ zoTa-IyBFW1Edv%iwPXOHSB5@lgV{?~ea}G|EBUSpOIpOU>6TF;%BZb7;clT|Q>b8e zYM(Z?hij=~4)x!zJP2PpF)YeLra@T~n%ggU=hyj4gYozIgIS{xFsi@Tbj%|TEDDQ> z$$q3Jb^kpIq_A&kwoi&2s;Ph@^yOXtqb}Y5{n8HzoNLQ6z$%&M$>*rvGang|Ow9hY zvt5y|17wY`$nMi|G%*Dl%9$VF0`PypmSWfa9b(2`K_i>rpa%*NLup&wf=@Gem9tc~ zO4B5~<)KJwX0B!*-F?|cDJ~-U&A1x7GcbCfJm`lLL-S;MYV_XcHern-f|)$EaM-r4MPjO|L3;?0%erv*D~DRYPNE zh^cbfnZ(hi1Nr!S*iFF=WtkWwfpR#%1>Rct=uyeLzRX>gd9)M4=H`P9Ouw|kuVY6B zJY>y5X4_p1%NVXJu7{RC*O5iz78I}Lt3jjD*nMOG)2xqVf43F0_(b}{kTXDnP1!xCgcgQJ$L{7MDk3m2seIWD6O zZ?(q0C*u>@&5!M|pM+g4vaIRWJa6nL->$r`(O5Rq@+m=d6twkXgKO?bGz6KZv|eFL zzLl9z>@E+*(Cb$wt`6`I!W;Vy^YDQl2DvqN%5iIpdV!=L;2#T^j?jUzV}O7Wqpjfi zIX^hfHL`>E>1s#R?TwZf9d{gt=UAMZ>*6F#^E|kFDj<3hS{E=AUMD<9Wd1SjbwE$e z5CLrpNb&pCM$tRNG_RM-28OEMD)5%rcZAf6sPRmQ9XjllBGOpueT&%4phvdrkMm8J zS;yeH9tvm)YVcnJR@jNB?GQFUVV#mmoe9}RG_#Wy98C#@ zTS8IK=I5k(kcNBcu=2;l}%P1A#wRxm;{ajMw7VJI>j2 z@~n&QiR*e$L=q+Hwk_;KF46_(>x^SA0bKzLKeeA8pM1VwA?cTrZC$M>i(%A1FGPhP zUgt~YI4}-X;C8LUj+9@D^f~Dte!;iXx*6I7^I#?hRU5QDeJk!KC;ljlF0gFW(5+Q2CwqCpGlo0n8PzXGCV9-r#TGQ`xQpUG+5q z`?I0~cq}xyaa8ZtmY~@+SP7zH+vdGA+2mvH;rRMDX|Cm}`gH#%sTNDU#geqU(umdc z2R7*pW^?j)cAC&LGx&{P9P~&;3&i*~K?ZgbL2oyu4;Y!SNJLeZ5;*w~+11eKK+&9z zaV$EoRz0^J1Xh*e;x$s74=dqmLnPdM^qidYz@YwB?@8aaGMqu~KSLw%jmKXHrfdmi z8SRl_H4{om)Ib`XHt!xS@(4Gd3H4#Xd%ap>(7LU}*#s`2@eHp7Rc2tn&+ zNo}YaiI8;O)BrgFj|}T>C6HZS46HC`qkAPDekr0x4EkOs*m0>168Z!%EJ&O?k3DC3 zPn{-L-4beWQhlqj<%NJA>)Nsp4DuEED2;1q)vm^wL%XD2c1*o=D{}WgDZGCc&hO#1 zFte{Em||eLai5R2K2wCVMNG?vr89fk{1tMrfZ0JnFTFcMnt!fAR9z8pGfe*h9Lvv7 zGr4y+S`v~! z?c`!Tnco)KToSwo=AE70Gnixu7j?!J3r>V+Kr9gV;Z%nd^AJ`hlHW5PCkvj}Zq9rJ z%E=t;?K4fNux+_`iAf0+Uw&XK62umaOiyWcK|Tna25Z?RFweVG@=WIUUqDd^{A4OF zFNcJJz(=jobH4%>GSD+E0jKTF((+b}&!X2Is>gl8`Sa+HrI9T1Pzh{fgHuvw34oXM zPVCM_85L!+VEUTwSmrOVsDLP@2VZ<@y){X!3Kr)jKO?6P)=0Hx+}_ZD6symKi0u@r zJVzPea&f*|Ag&Vr(TSJY!=|f3>);ja7sRCA+lRn7PW&pPMIRm^1@b)zJSs~)+5^qa zFm8j?%E4Cz!jR~;@h2H+X!B<0Isjr8P*Oj=RGK=}82zH-{G^;|XjX1$X-h=2MlAy( zrh^08@=MibrO-vvV0Q*EJ7iuh^qaoy(jDE2!?E1bV#OUP zYV1HP4}t?hBg@qC^-6EfQ)GnAfG8ePp0w&uSpTu^79Ck5nf%#;1j^Dy(L06E!a`X-@rVWc=3-g_LD7?!emiW(Ob!jUF3b z59scQZ123KQausy!SdEU(10V$cHcmd{G2K!ghJ3o0@*;UbdX*h+K*eGzH99{WJMDjmgGjRatjxL{&qyf}q zc_@!=x!PGEY?V?*1(chhlPacu8~620LC(vn@OlZUMxw^&4y!2Ful&Q%vt>z#-By#- zT*>94cmPmr5!RISC1R8We>I$txzxnCo3ncmXXU8`#7d~D2)*G^44lRTf10ZM}4N z>MmV66F7}Kdjx%Yt3--rszkr^Y5HT$QEOw5ek5t&Q(axLAMWUlqgvIwGxW-5 z%AwVn?opD9t_?x~$>;BYSWlJ@kZ!<@Gt8<1LMvAAsc1ct1C-P`^1NH_d&p zJqb{8BOoD34Gc}2RSVTOF@c<&kcYws6JYDQ)D!3RrYzgldW9LFYWTUnAbVur+fiQD zrDMo!c2^mdpy<%$M=_|!e%#SzEi&TCbT~SxdM*(GF6ELpQeWL9CLJrxPySW)o&v?Q zRRaWX7vG6%v%{ZBl*wHP%sXX7c?M(iQy{S9=lFdfBWW!(7$&Vf<$7bEsdd9RlYZ`S zQM5@#ULYSNaTtlXUo&f8JoHl>^Igkf{XQcjTo2BN{q1S6_;c-JSnrB$I6e=zRc(gG zl#;68tf+=$dDoE<6<$5HBWBZmAb2@bvDRNfbQFwDw{&Sf4(|(S>oCX>rg&x?{Yu>Y zOjICc&2_d#v=IjxwN10>OrYT&N&TBKMpnQF z)6E0ke%pyV7lT;zzh>?ZXVX~{o04_LIW3DVbqOc5{n*OqZ-OmaFZyd7nEf_K^bXTD zbq2jyf)Adb33u%V4UDNRa-f?c8fT_KG6s$0(KhU(7d={6pLp#Eyb%?&yrmSf=sf)W z_J&&bg4@~}j8+HU^dQXxQEM9DyEO225DB*!J;0ZRci#Rvj^LCS*5=JG-j`Q#>0DdA zK<2kP_GL`IIv1&6bvW7DHA1zf%MdY%|MDxkt%|4Xte2F1&@t>(R54NYo1J?hSTdhp zK5HIA{n&jusDtc%)+U~+9&POK@xbX2Wmt87a$|E7vDo^}V&El@zXoZeeR$=#P)kvm z%5i+yDHAY8cumx3?UoWa4^d_JRPBu;D}P`fsi!c>%@1w_Bwg?XrA+Ha)Kjm<>`!6$ zr?78ItGT^oi2>5g9=|`S$jbq?T}U9Az6ZMVQ>sKWg@C|F#l6F=_LI*|O(1lS@J7FW zgkuoUzd7G|bJC1G8`NqHJB1PUb*ur)E6hO8p&EK+fmu0sD$K^%YlSgYugRG9@qxGY z3((rvaQzkSsclWpYFYPHU;Nx*^xFH<3bVQo97JE*z+fqDX8RB-avCXw{=}Cl`7TX& z53I=}x}kP@lb^ljIIsI$d{aWw!lzygN)gVVOO!0)B~)O{#sI;;F5t$%hQw%EO*{0$ zmN$5Vz4osjjt1E`ZDK@We5DQc`8nh)qx-JH&8e&hS%%GRejuNdVQvnnyA|11P`Z&cS28^ISne$$F- zpL?p~cK;>`w@ezy$@#p66SM~H{FS_z`uI{&rV>XhsL_Z=ce;n~YN~S%|CNE{KWx46IV`@Qp^NIn}n(S7yyW?ki%L4_lXoDkLP^ zE+~{kM(>%kefbYd0 zn6VO93TSI=)t2RZboX~9MLD9*Ja~*xIZ={^onTcNas5z5m7m*WT>3|)iIY=2$~2{? z4hE&NYZ~V*4ct5R19fkCOK!+s(zIC*jT!Pqw-MZaD2;py zLn{hbtNP^>L0JWb%-^7co+hk;w?5|1))Ru-<#y1Nj2Y5z>5dRFCSb^-NG}$<8W!%C zf+X*jl91R}xRrdc8AWbzd#xf65c%0Wz+=5o`k$@$Z8$UdwrE_Id=%pC zy63rZb$XUOAV$O>q^kABt}m@_$00;<4ExP1OEburYTRm(yV_D1X<+c}&~nbYOK|tk zK_0v>N77TEwERa(jt^mTPzbuaf_fZ@0ngE#B9cTejUHKo=}~ruhLO*a=nsemSFm&qfBjMx}7B2k-h#cDfj?w z@Z+`@TI`gD^YjCehE329b{d(*b-?2l)EA+!Cc34S_f4jdur%u4^! zr}EJHTV^AT{#V2_)qa}EEH;6O9Z(;gUNQ(r^HCGneIS)L;vEO4#44Xm*RZP;9UPLH!`QA;sl=`>73DC8N@a64r)?_bkWgGg!-^}C!or-% zIXNX{2R6*vX2$GjeBama_up>2-S)?Bd+qgp9v+YTBh$R1`C^xq8kFW$aGaZ#i20gO z%$T?^nP0|nis(+y58fEyw34rJC0}CFM>~^|p0*|=r%6Tv|ebok7h{5&!Mw#V!+vi z<}bdrg^O*7QU~}X4BL5!$v`$qT6xXJ8+FvXt1oSu7G+9ZuQ!Cm-fd)Ge|b5$s=c9( zF~|?C6TL|@t7Q5ukqA|Eizb>8qp^uFS(_lrRjH~fuJZFY^|31Z)HK3jx;6XQC8y=!5GYi)wiWoss6a2 zNDiy#L>kv@4x<&6C8lNr-e0L?#h8GN-dH6g+dNzaBBJ!TyWkmQynbV? z)W1pO+w`*$cm=|mcg`F|MSS~Sl~no7*M0T1C=c9luPi2~a`C^5|Iz8^;e5p`acOot zWc9oGZtnwOi1NRtn>H4k7-7WOFda>&nqc+G3vZuU-SYLjBD~3YdXw_W2QykdkwiX? z%`8=ny8c+|c;5fxS-|eVN6*uW)iQs%cQ~QHnNeJJdI0nfVn9Roq)wzy%;OO`kT`pM z-UyuKHBYb?J~>j(k94YAx!M1q+&|Kh#8v-x@Wq)1lOlok75zR?L0Y8W-|%n#3-fIe zc-qTnVE9SVPFMoq<8%DsQ<+%Odnl+P;2P9xZx^Wx0u|-{ZeSq0>fhXZ7Q5%*iHhd( zFS`-v(8ETS7(inmPkjD14}`r*OVEX?v(HcFb#2>A3TU@&-~_xh=v)9+)m~20YtV3w z?f4%lxK%671we8D$oM_VIX2@I&*O+Z_VP<40$5j~By(|P-mMx`T`NKh>;}H#9TbsZ z%xP2e^E!-wY}h}sg_P?o;FKCAW}5F+g2Tdhk+qg=vH!^jBWklS~45Mj=ybud@;W_0e7RrBP1Z%Cpz3#->wsRUtDzU&1Xj1W6o<-C-rQBJJ=``=tG z%KYNDf*?&1SKIF@xIV}zT2K4-401kVjApfPHRVBuYf#tc&eZS+je|K$r^YGi$D!Ll zl4_)a7I0%gymnZ`ZJ(twIS0AH5mBoeu=L1F^~c69wD<0T6SKtL&5qFUZ#P3$&**6P z`fOl=8@l&lg7wU{=>+sZak<|KSR=Dz0rlTZT#v`Bow=PodTcvDd0^c5U6TImo;x4V z-(BQ6eW!t11xxYY(t3dykMK+QBFd%zM6S2ucy{hTM6Qj(w^o-f&|t2 zXZ96$&io5+$tz4UCL3%lsDrH)mX=i)0kZ^m2PW~{vR2OOfe^&9;i)!@Xe{1iaP`>l z)|4On1W*6d9Jbjz0n<6!^nJ98P)XyoaEpKHDNwVrEH{Nuzb>y?UD2AUwg#LEm-y!KT@ zW^(U*Sp1F95^g{p1d;rVt%LK%JX_DYRQdaor2S0~(#l6d>l({S=-=I`;$j(R$*M5EzA4I zRTH1~@Z!DUVsq5GciroZZ1^z^z0N=+=7Srf1Giq>)_Ldy?dFy2IFQ>TFd!HkrPscf zxNsZd{-^azXWmpEOmO9UKw{>@W!KxyKT$Bt>Ukt~qF4E@uiF%HJ-SS*TUf02vsb_QVvbrDeE9Fk#G>-Jbm#my>9L zDC?9S{!c-|X*E*pRvgk7bcOqv9GH(YgqwR6lJxOI!{=3CqirXI%+)`Ad;+xq>V|x4 zU2vdUN)E9Dl9{a)JXOi_Ma#dv@TU2W7!Yne#JFQ)7QIKDQhRMhvPKh>dsLu{>2UB! zcOP)AWkgSx^8$Tz*sOr&B~c-?p_nO z7F^o!nHM>b$OwUcJ(g;%5$dJC-86C`*g@?MI3Xnxw{mGJrNnT90twcXzZgpCPuQ8Q zdexe6m`iIueV}~ehj;LaN3H$;o}vfY>Zmb1NXB~a64{4h0f$Ed=p$yAd1i3P8rQ=j zmMpu7(KY%d)hhlpjp0R()S5d7>5BcGJQbH?Nt65vj8!IE^(<}(&p+;TKnPnMFv*lb zr!u#xeJ<`XNy=jbUca;OnBT%vq+g+R!1LC7&qqMkszeU(h>O7m`fyIq{tqE>KIffb z|419LAQC$ZUMka`pt!<(Vx(7NP6+88`b4Y$1Gd@7o8dt_vmFXD40yJsG!4d5*H)o( z2tuwiCA&$kUtTp4tbeX&CM2E7My%gxkGo~P#`qWe6Tedp1~@LvgO=t9{@yQr zze+fkQvrv9K4m6$bU9DHLz($*+!}LsT@>t(zWXI=3@vAj#M0VZ9f+QHIcc`EaAtMG zy8C%N3%5I^3e&ea36A5pIYrEvk}c{D$9)N54U29WGgoF)!u&MT20b?n(P-}YF=6_z zW~CnpIN+OlVD!soKv!5kX6`?-}`^g=P*1n?$2?*Fcbr806cObIbtGwM5&k zcUuOA)wLm7xBu7GWI|^rxUD=dtZc||`(gZf82gRi2t8Y%r^ozfX-0mbD!PbGI+%$s z7e>p+4MZvtwZX2Z2f*Al5`)#=fSp~<9Vy6A*4|trY$^U~GkLi&+bKt@$LMduRFV!k zo$)~j9^{SFJ7995xi9>FBA}^N6dKMN9kESIYoO@Kf(7@gwq)Mc_!ay#KjFdN*IoV)+UYp#ic=Z*!d8@0LS!M8)|!=-tR}DSu`uN)G6`Q$6`1yzBu|IQ19g z(Mv#qnJ$R~tz%lak9oHe+&U5g5C~xP!bDE@!f@$Tl9(JBZN3}eT`Z{EtbE;0J>R+~ z7j|~G)rj+Y+f@gz!X#~0M|w&4rK@h-y-=;yBZzf{_Ji57b_kg!c+@};FNj{q4GGM% zV=W>CUmU$!yO=+u5!t|h!REZwugGyi|16R8L|0sIj6pOBQ}r>%o4Gi~ecq5`vj64^ z)3#FE#Q}?y`ZF2H?YX6=34RfmtFEb{meP2{&fbdQ5!X{a?1WNrlJK>Pyny8&Yo-l1 z_~xa1^UX9IvK2~*G_HPTKRTFcB|mlp_UkXL;%+ya{pz$V(?0gftEye(L!}3!K~c2U zSP&~BPf?uFfC�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 literal 0 HcmV?d00001 From db2a9f7602ec4b6e9c04a417d77425e4c82afafa Mon Sep 17 00:00:00 2001 From: ali_salman Date: Mon, 11 Apr 2016 16:44:27 +0500 Subject: [PATCH 2/3] Aspose.Slides Java for NetBeans --- Plugins/Aspose.Slides Java (Maven) for NetBeans/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/README.md b/Plugins/Aspose.Slides Java (Maven) for NetBeans/README.md index fd6af9ca..4ed927cd 100644 --- a/Plugins/Aspose.Slides Java (Maven) for NetBeans/README.md +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/README.md @@ -41,4 +41,4 @@ For more info about the **Aspose.Slides for Java API**, [please check the api do ## Plugin Documentation -For the most complete documentation, [Please check this WIKI](http://www.aspose.com/docs/display/slidesjava/Aspose.Slides+Java+for+NetBeans+-+Maven) \ No newline at end of file +For the most complete documentation, [Please check Aspose Docs](http://www.aspose.com/docs/display/slidesjava/Aspose.Slides+Java+for+NetBeans+-+Maven) \ No newline at end of file From cef74de67938c4fa3722228b8b172de8fc46ea28 Mon Sep 17 00:00:00 2001 From: ali_salman Date: Mon, 11 Apr 2016 19:34:39 +0500 Subject: [PATCH 3/3] Updated copyright year --- .../slides/maven/examples/AsposeExamplePanel.java | 5 +---- .../maven/examples/CustomMutableTreeNode.java | 2 +- .../aspose/slides/maven/utils/AsposeConstants.java | 2 +- .../aspose/slides/maven/utils/AsposeJavaAPI.java | 6 ++---- .../maven/utils/AsposeMavenProjectManager.java | 13 +------------ .../slides/maven/utils/AsposeSlidesJavaAPI.java | 2 +- .../aspose/slides/maven/utils/FormatExamples.java | 5 +---- 7 files changed, 8 insertions(+), 27 deletions(-) diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExamplePanel.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExamplePanel.java index 57f19063..e3be4dd4 100644 --- a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExamplePanel.java +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/AsposeExamplePanel.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 1998-2015 Aspose Pty Ltd. + * Copyright (c) 1998-2016 Aspose Pty Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * @@ -24,9 +24,6 @@ import org.openide.util.Exceptions; import org.openide.util.NbBundle; -/** - * Created by Adeel Ilyas on 12/16/2015. - */ public final class AsposeExamplePanel extends JPanel { AsposeExampleWizardPanel panel; diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/CustomMutableTreeNode.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/CustomMutableTreeNode.java index 2cc73981..5092f81e 100644 --- a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/CustomMutableTreeNode.java +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/examples/CustomMutableTreeNode.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 1998-2015 Aspose Pty Ltd. + * Copyright (c) 1998-2016 Aspose Pty Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeConstants.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeConstants.java index 5da9f1bd..4bbc4bf0 100644 --- a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeConstants.java +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeConstants.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 1998-2015 Aspose Pty Ltd. + * Copyright (c) 1998-2016 Aspose Pty Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeJavaAPI.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeJavaAPI.java index cb803498..1aeb7ddc 100644 --- a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeJavaAPI.java +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeJavaAPI.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 1998-2015 Aspose Pty Ltd. + * Copyright (c) 1998-2016 Aspose Pty Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * @@ -16,9 +16,7 @@ import org.netbeans.api.progress.aggregate.ProgressContributor; import org.openide.util.Exceptions; -/** - * Created by Adeel on 12/16/2015. - */ + public abstract class AsposeJavaAPI { /** diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeMavenProjectManager.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeMavenProjectManager.java index f5bf4a25..49958aa2 100644 --- a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeMavenProjectManager.java +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeMavenProjectManager.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 1998-2015 Aspose Pty Ltd. + * Copyright (c) 1998-2016 Aspose Pty Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * @@ -45,17 +45,6 @@ import org.openide.xml.XMLUtil; import org.w3c.dom.Node; -/* -* @author Adeel Ilyas -* Date: 12/21/2015 -* - */ - -/** - * - * @author Adeel - */ - public class AsposeMavenProjectManager { private boolean examplesNotAvailable; diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeSlidesJavaAPI.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeSlidesJavaAPI.java index d1d2756e..33de4960 100644 --- a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeSlidesJavaAPI.java +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/AsposeSlidesJavaAPI.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 1998-2015 Aspose Pty Ltd. + * Copyright (c) 1998-2016 Aspose Pty Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * diff --git a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/FormatExamples.java b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/FormatExamples.java index 7cd2f8cc..3a338633 100644 --- a/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/FormatExamples.java +++ b/Plugins/Aspose.Slides Java (Maven) for NetBeans/src/com/aspose/slides/maven/utils/FormatExamples.java @@ -1,7 +1,7 @@ /* * The MIT License (MIT) * - * Copyright (c) 1998-2015 Aspose Pty Ltd. + * Copyright (c) 1998-2016 Aspose Pty Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * @@ -13,9 +13,6 @@ import org.apache.commons.lang.WordUtils; -/** - * Created by Adeel Ilyas on 12/16/2015. - */ public class FormatExamples { /**