From 2af76e62781dfbbbfb5dde6a97d69a2e333bb2ea Mon Sep 17 00:00:00 2001 From: Konstantinos Giannoutakis <kgiannou@iti.gr> Date: Tue, 3 Jul 2012 07:29:15 +0000 Subject: [PATCH] --- .../.project | 17 - .../build.properties | 1 - .../feature.xml | 264 ---- .../.classpath | 7 - .../org.ops4j.pax.runner.eclipse.ui/.project | 28 - .../.settings/org.eclipse.jdt.core.prefs | 12 - .../META-INF/MANIFEST.MF | 20 - .../baseline.jar | Bin 10348 -> 0 bytes .../build.properties | 9 - .../fragment.xml | 13 - .../images/logo_32x32.png | Bin 908 -> 0 bytes .../images/noStart.jpg | Bin 538 -> 0 bytes .../images/start.jpg | Bin 654 -> 0 bytes .../images/uAAL.png | Bin 3119 -> 0 bytes .../org.ops4j.pax.runner.eclipse.ui/pom.xml | 23 - .../ops4j/pax/cursor/shared/Attribute.java | 71 - .../org/ops4j/pax/cursor/ui/CursorTab.java | 177 --- .../ops4j/pax/cursor/ui/CursorTabBlock.java | 67 - .../org/ops4j/pax/cursor/ui/DeltaEvent.java | 13 - .../ops4j/pax/cursor/ui/IDeltaListener.java | 5 - .../ops4j/pax/cursor/ui/IModelVisitor.java | 11 - .../java/org/ops4j/pax/cursor/ui/Model.java | 84 -- .../pax/cursor/ui/NullDeltaListener.java | 18 - .../org/ops4j/pax/cursor/ui/OptionsBlock.java | 284 ---- .../ops4j/pax/cursor/ui/ProvisionBlock.java | 1307 ----------------- .../pax/cursor/ui/ProvisionCellModifier.java | 142 -- .../cursor/ui/ProvisionContentProvider.java | 93 -- .../pax/cursor/ui/ProvisionLabelProvider.java | 87 -- .../org/ops4j/pax/cursor/ui/ProvisionURL.java | 178 --- .../swt-grouplayout.jar | Bin 40320 -> 0 bytes 30 files changed, 2931 deletions(-) delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/.project delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/build.properties delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/feature.xml delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/.classpath delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/.project delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/.settings/org.eclipse.jdt.core.prefs delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/META-INF/MANIFEST.MF delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/baseline.jar delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/build.properties delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/fragment.xml delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/logo_32x32.png delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/noStart.jpg delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/start.jpg delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/uAAL.png delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/pom.xml delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/shared/Attribute.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/CursorTab.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/CursorTabBlock.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/DeltaEvent.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/IDeltaListener.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/IModelVisitor.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/Model.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/NullDeltaListener.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/OptionsBlock.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionBlock.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionCellModifier.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionContentProvider.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionLabelProvider.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionURL.java delete mode 100644 uAALRunner/org.ops4j.pax.runner.eclipse.ui/swt-grouplayout.jar diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/.project b/uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/.project deleted file mode 100644 index 0407be844..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/.project +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>org.ops4j.pax.runner.eclipse.ui.AALStudio.feature</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.pde.FeatureBuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.pde.FeatureNature</nature> - </natures> -</projectDescription> diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/build.properties b/uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/build.properties deleted file mode 100644 index 64f93a9f0..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/build.properties +++ /dev/null @@ -1 +0,0 @@ -bin.includes = feature.xml diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/feature.xml b/uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/feature.xml deleted file mode 100644 index 19dc4a0ac..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui.aalstudio.feature/feature.xml +++ /dev/null @@ -1,264 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<feature - id="org.ops4j.pax.runner.eclipse.ui.aalstudio.feature" - label="Pax Runner Plugin for Eclipse UI for AAL Studio" - version="1.7.5.201110181545" - provider-name="OPS4j.org"> - - <copyright url="http://www.ops4j.org"> - Copyright 2009 Alin Dreghiciu. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -implied. - -See the License for the specific language governing permissions and -limitations under the License. - </copyright> - - <license url="http://www.apache.org/licenses/"> - Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -1. Definitions. -"License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document. -"Licensor" shall mean the copyright owner or entity authorized -by -the copyright owner that is granting the License. -"Legal Entity" shall mean the union of the acting entity and -all -other entities that control, are controlled by, or are under -common -control with that entity. For the purposes of this definition, -"control" means (i) the power, direct or indirect, to cause the -direction or management of such entity, whether by contract or -otherwise, or (ii) ownership of fifty percent (50%) or more of -the -outstanding shares, or (iii) beneficial ownership of such entity. -"You" (or "Your") shall mean an individual or Legal Entity -exercising permissions granted by this License. -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation -source, and configuration files. -"Object" form shall mean any form resulting from mechanical -transformation or translation of a Source form, including but -not limited to compiled object code, generated documentation, -and conversions to other media types. -"Work" shall mean the work of authorship, whether in Source or -Object form, made available under the License, as indicated by -a -copyright notice that is included in or attached to the work -(an example is provided in the Appendix below). -"Derivative Works" shall mean any work, whether in Source or -Object -form, that is based on (or derived from) the Work and for which -the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. For the -purposes -of this License, Derivative Works shall not include works that -remain -separable from, or merely link (or bind by name) to the interfaces -of, -the Work and Derivative Works thereof. -"Contribution" shall mean any work of authorship, including -the original version of the Work and any modifications or additions -to that Work or Derivative Works thereof, that is intentionally -submitted to Licensor for inclusion in the Work by the copyright -owner -or by an individual or Legal Entity authorized to submit on behalf -of -the copyright owner. For the purposes of this definition, "submitted" -means any form of electronic, verbal, or written communication -sent -to the Licensor or its representatives, including but not limited -to -communication on electronic mailing lists, source code control -systems, -and issue tracking systems that are managed by, or on behalf -of, the -Licensor for the purpose of discussing and improving the Work, -but -excluding communication that is conspicuously marked or otherwise -designated in writing by the copyright owner as "Not a Contribution." -"Contributor" shall mean Licensor and any individual or Legal -Entity -on behalf of whom a Contribution has been received by Licensor -and -subsequently incorporated within the Work. -2. Grant of Copyright License. Subject to the terms and conditions -of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute -the -Work and such Derivative Works in Source or Object form. -3. Grant of Patent License. Subject to the terms and conditions -of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -(except as stated in this section) patent license to make, have -made, -use, offer to sell, sell, import, and otherwise transfer the -Work, -where such license applies only to those patent claims licensable -by such Contributor that are necessarily infringed by their -Contribution(s) alone or by combination of their Contribution(s) -with the Work to which such Contribution(s) was submitted. If -You -institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work -or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses -granted to You under this License for that Work shall terminate -as of the date such litigation is filed. -4. Redistribution. You may reproduce and distribute copies of -the -Work or Derivative Works thereof in any medium, with or without -modifications, and in Source or Object form, provided that You -meet the following conditions: -(a) You must give any other recipients of the Work or -Derivative Works a copy of this License; and -(b) You must cause any modified files to carry prominent notices -stating that You changed the files; and -(c) You must retain, in the Source form of any Derivative Works -that You distribute, all copyright, patent, trademark, and -attribution notices from the Source form of the Work, -excluding those notices that do not pertain to any part of -the Derivative Works; and -(d) If the Work includes a "NOTICE" text file as part of its -distribution, then any Derivative Works that You distribute must -include a readable copy of the attribution notices contained -within such NOTICE file, excluding those notices that do not -pertain to any part of the Derivative Works, in at least one -of the following places: within a NOTICE text file distributed -as part of the Derivative Works; within the Source form or -documentation, if provided along with the Derivative Works; or, -within a display generated by the Derivative Works, if and -wherever such third-party notices normally appear. The contents -of the NOTICE file are for informational purposes only and -do not modify the License. You may add Your own attribution -notices within Derivative Works that You distribute, alongside -or as an addendum to the NOTICE text from the Work, provided -that such additional attribution notices cannot be construed -as modifying the License. -You may add Your own copyright statement to Your modifications -and -may provide additional or different license terms and conditions -for use, reproduction, or distribution of Your modifications, -or -for any such Derivative Works as a whole, provided Your use, -reproduction, and distribution of the Work otherwise complies -with -the conditions stated in this License. -5. Submission of Contributions. Unless You explicitly state otherwise, -any Contribution intentionally submitted for inclusion in the -Work -by You to the Licensor shall be under the terms and conditions -of -this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or -modify -the terms of any separate license agreement you may have executed -with Licensor regarding such Contributions. -6. Trademarks. This License does not grant permission to use -the trade -names, trademarks, service marks, or product names of the Licensor, -except as required for reasonable and customary use in describing -the -origin of the Work and reproducing the content of the NOTICE -file. -7. Disclaimer of Warranty. Unless required by applicable law -or -agreed to in writing, Licensor provides the Work (and each -Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express -or -implied, including, without limitation, any warranties or conditions -of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A -PARTICULAR PURPOSE. You are solely responsible for determining -the -appropriateness of using or redistributing the Work and assume -any -risks associated with Your exercise of permissions under this -License. -8. Limitation of Liability. In no event and under no legal theory, -whether in tort (including negligence), contract, or otherwise, -unless required by applicable law (such as deliberate and grossly -negligent acts) or agreed to in writing, shall any Contributor -be -liable to You for damages, including any direct, indirect, special, -incidental, or consequential damages of any character arising -as a -result of this License or out of the use or inability to use -the -Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all -other commercial damages or losses), even if such Contributor -has been advised of the possibility of such damages. -9. Accepting Warranty or Additional Liability. While redistributing -the Work or Derivative Works thereof, You may choose to offer, -and charge a fee for, acceptance of support, warranty, indemnity, -or other liability obligations and/or rights consistent with -this -License. However, in accepting such obligations, You may act -only -on Your own behalf and on Your sole responsibility, not on behalf -of any other Contributor, and only if You agree to indemnify, -defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by -reason -of your accepting any such warranty or additional liability. -END OF TERMS AND CONDITIONS -APPENDIX: How to apply the Apache License to your work. -To apply the Apache License to your work, attach the following -boilerplate notice, with the fields enclosed by brackets "[]" -replaced with your own identifying information. (Don't include -the brackets!) The text should be enclosed in the appropriate -comment syntax for the file format. We also recommend that a -file or class name and description of purpose be included on -the -same "printed page" as the copyright notice for easier -identification within third-party archives. -Copyright [yyyy] [name of copyright owner] -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at -http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express -or implied. -See the License for the specific language governing permissions -and -limitations under the License. - </license> - - <url> - <update label="OPS4J Pax Eclipse Update Site" url="http://www.ops4j.org/eclipse/update"/> - </url> - - <requires> - <import plugin="org.eclipse.pde.ui" version="3.6.1.v20110210_r362" match="greaterOrEqual"/> - <import feature="org.ops4j.pax.runner.eclipse.core.feature" version="1.7.5.201106072115"/> - </requires> - - <plugin - id="org.ops4j.pax.runner.eclipse.ui.aalstudio" - download-size="0" - install-size="0" - version="0.0.0" - fragment="true" - unpack="false"/> - -</feature> diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/.classpath b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/.classpath deleted file mode 100644 index 32a9aa470..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/.classpath +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<classpath> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> - <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> - <classpathentry kind="src" path="src/main/java"/> - <classpathentry kind="output" path="bin"/> -</classpath> diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/.project b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/.project deleted file mode 100644 index 7f1cfbddb..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/.project +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<projectDescription> - <name>org.ops4j.pax.runner.eclipse.ui</name> - <comment></comment> - <projects> - </projects> - <buildSpec> - <buildCommand> - <name>org.eclipse.jdt.core.javabuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.ManifestBuilder</name> - <arguments> - </arguments> - </buildCommand> - <buildCommand> - <name>org.eclipse.pde.SchemaBuilder</name> - <arguments> - </arguments> - </buildCommand> - </buildSpec> - <natures> - <nature>org.eclipse.pde.PluginNature</nature> - <nature>org.eclipse.jdt.core.javanature</nature> - </natures> -</projectDescription> diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/.settings/org.eclipse.jdt.core.prefs b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index 29e417592..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,12 +0,0 @@ -#Fri Oct 14 16:07:25 CEST 2011 -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.debug.lineNumber=generate -org.eclipse.jdt.core.compiler.debug.localVariable=generate -org.eclipse.jdt.core.compiler.debug.sourceFile=generate -org.eclipse.jdt.core.compiler.problem.assertIdentifier=error -org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/META-INF/MANIFEST.MF b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/META-INF/MANIFEST.MF deleted file mode 100644 index 704c0e95c..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/META-INF/MANIFEST.MF +++ /dev/null @@ -1,20 +0,0 @@ -Manifest-Version: 1.0 -Bundle-ManifestVersion: 2 -Bundle-Name: OPS4J Pax Runner - Eclipse Plugin UI -Bundle-SymbolicName: org.ops4j.pax.runner.eclipse.ui.aalstudio;singleton:=true -Bundle-Version: 1.7.5.qualifier -Bundle-ClassPath: pax-runner-eclipse-ui, - src/main/, - ., - bin/org/ops4j/pax/cursor/ui/ -Bundle-Vendor: OPS4J.org -Fragment-Host: org.eclipse.pde.ui;bundle-version="3.3.0" -Require-Bundle: org.eclipse.ui, - org.eclipse.core.runtime, - org.eclipse.ui.forms, - org.eclipse.m2e.core.ui;bundle-version="1.0.0", - org.eclipse.m2e.core;bundle-version="1.0.0" -Bundle-RequiredExecutionEnvironment: J2SE-1.5 -Import-Package: org.eclipse.m2e.core, - org.eclipse.m2e.core.ui.internal, - org.slf4j;version="1.6.1" diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/baseline.jar b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/baseline.jar deleted file mode 100644 index f163ba996e40a3cf3f5f6dc7b0681dd84208bf69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10348 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 T00Dvg^P~9FT7ske?ce_Zr2SV_ diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/build.properties b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/build.properties deleted file mode 100644 index 32cea2607..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/build.properties +++ /dev/null @@ -1,9 +0,0 @@ -source.. = src/main/java/ -output.. = target/classes/ -bin.includes = META-INF/,\ - .,\ - fragment.xml,\ - bin/org/ops4j/pax/cursor/ui/,\ - images/,\ - swt-grouplayout.jar,\ - baseline.jar diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/fragment.xml b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/fragment.xml deleted file mode 100644 index d76037e9e..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/fragment.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<?eclipse version="3.2"?> -<fragment> - <extension - point="org.eclipse.debug.ui.launchConfigurationTabs"> - <tab - class="org.ops4j.pax.cursor.ui.CursorTab" - group="org.eclipse.pde.ui.launcher.EquinoxLauncherTabGroup" - id="org.ops4j.pax.cursor.ui.CursorTabUAAL" - name="Pax Runner Eclipse Plugin Tab"> - </tab> - </extension> -</fragment> diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/logo_32x32.png b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/logo_32x32.png deleted file mode 100644 index 0aa000ef9afd6ae48487acccf58c53424cf1aaba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 908 zcmV;719SX|P)<h;3K|Lk000e1NJLTq001BW001Be1^@s6b9#F800004XF*Lt007wo zLe@{A00009a7bBm000XU000XU0RWnu7ytkOBy>esbW?9;ba!ELWdKoiX=7_tX>Da7 zH!e0VHXtZXVPhaqQy^F=0HBLsr~m)}2XskIMF-ml4GkAJL4oi~0008(Nkl<Zc%1E4 zUr3Wt6hC)!{waqzjj8Kl%92?qI<j8;Lk@~cii8x4Fp5OWx2W8UIAU)05{y_HXg=tO ziVX85vTxLwkQx#6AWn>4N*}^>>X6($efQS))i75&%a<LvZ1<esIp=qO_xsL9P&C*= zQ*34P7=ajp7y)K+n_cjs(}t?|@5tQbFyvkB!Q#>b<i8MLjhCL?AuGywQC9^LqJj@^ zhCw6{F)wNYqh1eA-nvYJUl$>+;1KSux&SGfbP#S{f#By)f6OP*jN->#F8uPy4m8^Y zrA-dlWz3W14g><cu3D{*cm*3KaJT6M;*1{>O-JCA<wnFNk!(X((0%C`Vu*sdeE{@1 zIU8=iE&?8phbuMLf1BXS3RF4zAT>30Rr6Obo@2NBK2%gxKut|eSbTPN7F{kEP)fmI zFhFf>Edl%svsf%t%x4QL_vq;S{5<^~Zfw{~oA;%mI9wQ66a*m*XEYkQpRKyOIv#_z zwl?bX`D9>gYbzZeAD8!byPZl&Y>5vQ4h;>hA|MR*)APHx(e30X)@(M*xZd7gxlU$g zCY5SHR#p}dFo56h=O=YKojlms*htIE%lUVO_-;!Dv|4SL3WI%Jw0VCz^?C%_($W&v zNW#_E*UNr~!y)HFLP7!$Fk`Z)R4SaFp5~3KtE*+8&1MTz!tHj`k(UB>ojXVy3R1A6 zqeI5(bUGPlwOYTQ^v7PK(QwSv)Rg20embR6$s2Tbc2e=KsJQ2Hv(MbzT%N>8Nrmz> zNwmFe2fbLJ7N;KJIJTGqOhE~!*X#MSker+>`xJaq5-chz!gbF9@6#tZ(PIV0@&b^Z z`Eb_x;NQK5Z^uS(VQ~qx85!Vz?SqfPJy6a}fJz)-@nvW5Xv4K=dUIP-flw%fJty-) zxg3yvqI5)AcpOh(cSd#UUu{hVg25mp6;}cs9UzHm*#P+^Xec?1g(lOcHD?ypkI`n> imj5G)5r`3p5%>n2MjFw%osbCt0000<MNUMnLSTXl=Z%g4 diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/noStart.jpg b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/noStart.jpg deleted file mode 100644 index ef03231b48b35a4be718dced026070da5c38b0af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmex=<NpH&0WUXCHwH#VMg|WcWcdG&LD;z{HL)Z$MWH;iBtya7(>LJ%Z3btM5{dxG z5Q+={Y5sqJL6C!ii$R2$QHg;`kdaxC@&6G92?hoxW(E|%&dR|Bl#vl&V1`%<lVxFL zV`gG!U=#z&iU56$3YdVR3WAIbjLgie2pL8}21P?5#~`M_#ElpK-(uilW&~Q!EXZKb zaI;o5en-Nu#VfCU{nN2%y507J{k?NORb=+;wJMB{^ygvHy#9slvsAEJ^{b{$zr9$r z@4Zqp=s!FEZpzJjtKZzZ8F@mnBXybgO&y`Swf`9=U0pr(u<~CmyXd_C43g|MmuD|@ znzFFeBiNz7{kh<?&df{y8LsXUpL9F+<A)2MU#ZS7Q%$xmGj#SodH!}>(lj~0LwBC! zZ~h|m!}Qnb-KmlJQ;IDvR=Y`m`p=+V%Ff2V>FB9TlfDVAj#+Ck@h8K=ONN$PrNa9p Y<c<H?IWl-1dl&O;Vv_OG_5W`I03Q>P`~Uy| diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/start.jpg b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/start.jpg deleted file mode 100644 index 7dc17ba32cc21cd5268c04dbe8655ed66cbd3151..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 654 zcmex=<NpH&0WUXCHwH#VMg|WcWcdG&LD;z{HL)Z$MWH;iBtya7(>LJ%Z3btM5{dxG z5Q+={Y5sqJL6C!ii$R2$QHg;`kdaxC@&6G92?hoxW(E|%&dR|Bl#vl&V1`%<lVxFL zV`gG!U=#z&iU56$3fMq;1c7=$+Tc=5%q)zog2HTK|8Fty0OgnjnFSf_8E!6>4d0&d zZT`w<SMPK!n{4;}V0*vRr<%;3y=JBHk^VhQn$OSoKC@V+v;87(=({N#)AwG9Sr{+X zTsqmkYW}9|<W!X|)&5F`qZyOG`tO;yGG?2k>`Nn|-{n6}SRbpo!zHqod6v`6)<6Ch z{bt^F)Bmlzu;zNy`u>(W@5#c6%5VNPGQH+%XQ;F`RWa{7X?H!eQsQ02CiMlJJ6<f$ znlf*rm-x>(58syg>z_~1Tc1(DKe;$~alxC8TPs(q$etF9`od@~EhV*8eNEIgyP(>Q zC+<D3i&wLcF3ni2`>8)w#ysP2P5hH@3mzPJX0bCWDDIGHcIz?Wb_F4;Fm=;KK5q{* zKPx|e>c>wniDf;n7G0WKwRhcSwJU$VRCexdaq-DxZcI6=cV2*XhgB5AGEOgz=M!Eo mIyASgI@HZ)>CYFRg{wI_W}IPbI`L(<jfdEScQ4rg-vj_vNyjSy diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/uAAL.png b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/images/uAAL.png deleted file mode 100644 index c649a23dd1b9ce371cba71907f499e1387d9649a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3119 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 diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/pom.xml b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/pom.xml deleted file mode 100644 index 6141109d0..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/pom.xml +++ /dev/null @@ -1,23 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>org.ops4j.pax.runner</groupId> - <artifactId>pax-runner-eclipse</artifactId> - <version>1.7.5-SNAPSHOT</version> - <relativePath>../pom.xml</relativePath> - </parent> - - <groupId>org.ops4j.pax.runner</groupId> - <artifactId>pax-runner-eclipse-ui</artifactId> - <packaging>eclipse-plugin</packaging> - - <name> - OPS4J Pax Runner - Eclipse Plugin UI - </name> - <description> - OPS4J Pax Runner - Eclipse Plugin OSGi Frameworks Launch Configuration Tab - </description> - -</project> diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/shared/Attribute.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/shared/Attribute.java deleted file mode 100644 index 6b723712c..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/shared/Attribute.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2007 Alin Dreghiciu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.ops4j.pax.cursor.shared; - -/** - * Pax Runner Eclipse Plugin configuration attributes names. - * - * @author Alin Dreghiciu - * @since 0.2.0, December 16, 2007 - */ -public class Attribute -{ - - /** - * The name space of Pax Runner Eclipse Plugin configuration attributes. - */ - private static final String NAME_SPACE = "org.ops4j.pax.cursor"; - - /** - * Overwrite all bundles attribute. Value is a boolean. - */ - public static final String OVERWRITE_ALL = NAME_SPACE + ".overwrite"; - /** - * Overwrite user bundles bundles attribute. Value is a boolean. - */ - public static final String OVERWRITE_USER = NAME_SPACE + ".overwriteUserBundles"; - /** - * Overwrite system bundles attribute. Value is a boolean. - */ - public static final String OVERWRITE_SYSTEM = NAME_SPACE + ".overwriteSystemBundles"; - /** - * Log level attribute. Value is a String. - */ - public static final String LOG_LEVEL = NAME_SPACE + ".logLevel"; - - /** - * Enable hot deployment of bundles. Value is a boolean. - */ - public static final String HOT_DEPLOYMENT = NAME_SPACE + ".hotDeployment"; - - /** - * Provisioning urls attribute. Value is a map where the key is the url to be provisioned and value is a "@" - * separated string of selected, start, start level, update options. - */ - public static final String PROVISION_ITEMS = NAME_SPACE + ".provisionItems"; - /** - * Profiles attribute. Value is a list of profiles names. - */ - public static final String PROFILES = NAME_SPACE + ".profiles"; - - /** - * Pax Runner Arguments attribute. Value is a list of Pax Runner arguments that Pax Runner Eclipse Plugin sends them - * unchanged. - */ - public static final String RUN_ARGUMENTS = NAME_SPACE + ".runArguments"; -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/CursorTab.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/CursorTab.java deleted file mode 100644 index 746358eab..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/CursorTab.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright 2007 Alin Dreghiciu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.ops4j.pax.cursor.ui; - -import java.util.List; -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; -import org.eclipse.debug.ui.ILaunchConfigurationTab; -import org.eclipse.jface.dialogs.Dialog; -import org.eclipse.pde.internal.ui.IHelpContextIds; -import org.eclipse.pde.internal.ui.PDEPluginImages; -import org.eclipse.pde.ui.launcher.AbstractLauncherTab; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.ui.PlatformUI; -import org.ops4j.pax.cursor.shared.Attribute; - -/** - * Pax Runner Eclipse Plugin Tab is an extension on - * org.eclipse.debug.ui.launchConfigurationTabs that adds extra options for Pax - * Runner Eclipse Plugin. The extra options are lose coupled with Pax Runner - * Eclipse Plugin, as if this Cursor does not exist or is not installed it will - * have no influence on Pax Runner Eclipse Plugin. The only connection between - * the two is through a configuration attribute that is created by this tab on - * succesfull save (apply), atribute that contains a list of options that Pax - * Runner Eclipse Plugin will read and if present will send them unchanged to - * Pax Runner. - * - * @author Alin Dreghiciu - * @since 0.2.0, December 16, 2007 - */ -public class CursorTab extends AbstractLauncherTab { - - private ProvisionBlock m_provisionBlock; - private OptionsBlock m_optionsBlock; - private Image m_image; - private boolean m_initializing; - - public CursorTab() { - m_initializing = false; - m_image = PDEPluginImages.DESC_PLUGINS_FRAGMENTS.createImage(); - } - - public void createControl(final Composite parent) { - Composite container = new Composite(parent, SWT.NONE); - final GridLayout gridLayout = new GridLayout(); - gridLayout.verticalSpacing = 0; - gridLayout.marginWidth = 0; - gridLayout.marginHeight = 0; - container.setLayout(gridLayout); - container.setLayoutData(new GridData(GridData.FILL_BOTH)); - - m_optionsBlock = new OptionsBlock(container, SWT.NONE); - m_optionsBlock.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, - false)); - - m_provisionBlock = new ProvisionBlock(container, SWT.NONE); - m_provisionBlock.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, - true)); - - m_optionsBlock.setCursorTab(this); - m_provisionBlock.setCursorTab(this); - Dialog.applyDialogFont(container); - setControl(container); - // m_provisionBlock.initializeFrom2( configuration ); - PlatformUI.getWorkbench().getHelpSystem() - .setHelp(getControl(), IHelpContextIds.LAUNCHER_CONFIGURATION); - } - - /** - * @see ILaunchConfigurationTab#getName() - */ - public String getName() { - return "uAAL Pax Runner"; - } - - ILaunchConfiguration configuration; - - /** - * Initialize by delegating to component blocks. - * - * @see ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration) - */ - public void initializeFrom(final ILaunchConfiguration configuration) { - this.configuration = configuration; - m_initializing = true; - try { - m_optionsBlock.initializeFrom(configuration); - m_provisionBlock.initializeFrom(configuration); - - } finally { - - m_initializing = false; - } - } - - /** - * Saves the configuration attributes by delegating to component blocks. - * First it will save a "null" Pax Runner Eclipse Plugin options so every - * block will have the chance to add it's own options. - * - * @see ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy) - */ - public void performApply(final ILaunchConfigurationWorkingCopy configuration) { - // reset Pax Runner arguments - configuration.setAttribute(Attribute.RUN_ARGUMENTS, (List) null); - // delegate to each block - m_optionsBlock.performApply(configuration); - m_provisionBlock.performApply(configuration); - } - - /** - * Does nothing, as there are no defaults to be set. - * - * @see ILaunchConfigurationTab#setDefaults(ILaunchConfigurationWorkingCopy) - */ - public void setDefaults(final ILaunchConfigurationWorkingCopy configuration) { - - // no initial values - } - - public Image getImage() { - ImageData ideaImage = new ImageData(getClass().getResourceAsStream( - "/images/uAAL.png")); - Image image = new Image(Display.getCurrent(), ideaImage); - final int width = image.getBounds().width; - final int height = image.getBounds().height; - final Image scaled050 = new Image(Display.getCurrent(), image - .getImageData().scaledTo((int) (width * 0.35), - (int) (height * 0.35))); - // return m_image; - return scaled050; - } - - public void dispose() { - if (m_image != null) { - m_image.dispose(); - } - } - - public void updateLaunchConfigurationDialog() { - if (!m_initializing) { - super.updateLaunchConfigurationDialog(); - } - } - - /** - * Does nothing as there is no validation required. If URL's are wrong will - * be checked by pax Runner. - * - * @see AbstractLauncherTab#validateTab() - */ - public void validateTab() { - // no validation required - } - -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/CursorTabBlock.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/CursorTabBlock.java deleted file mode 100644 index b5f6728d2..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/CursorTabBlock.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2007 Alin Dreghiciu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.ops4j.pax.cursor.ui; - -import org.eclipse.swt.widgets.Composite; - -/** - * Base class for Pax Runner Eclipse Plugin blocks that adds easy to use notification for the Tab that something was - * changed so the Launch Dialog get's notified that it should apply (call) for changes. - * - * @author Alin Dreghiciu - * @since 0.2.0, December 16, 2007 - */ -public class CursorTabBlock - extends Composite -{ - - /** - * Pax Runner Eclipse Plugin Tab. - */ - private CursorTab m_cursorTab; - - /** - * @see Composite#Composite(Composite, int) - */ - public CursorTabBlock( final Composite parent, final int style ) - { - super( parent, style ); - } - - /** - * Sets Pax Curstor Tab. - * - * @param cursorTab cursor tab - */ - public void setCursorTab( final CursorTab cursorTab ) - { - this.m_cursorTab = cursorTab; - } - - /** - * Notify that a change occured in this block. Delegates to Pax Runner Eclipse Plugin Tab. - */ - protected void notifyUpdate() - { - if( m_cursorTab != null ) - { - m_cursorTab.updateLaunchConfigurationDialog(); - } - } - -} \ No newline at end of file diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/DeltaEvent.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/DeltaEvent.java deleted file mode 100644 index d07c40628..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/DeltaEvent.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.ops4j.pax.cursor.ui; - -public class DeltaEvent { - protected Object actedUpon; - - public DeltaEvent(Object receiver) { - actedUpon = receiver; - } - - public Object receiver() { - return actedUpon; - } -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/IDeltaListener.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/IDeltaListener.java deleted file mode 100644 index 1e2507c92..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/IDeltaListener.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.ops4j.pax.cursor.ui; -public interface IDeltaListener { - public void add(DeltaEvent event); - public void remove(DeltaEvent event); -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/IModelVisitor.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/IModelVisitor.java deleted file mode 100644 index e786f807d..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/IModelVisitor.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.ops4j.pax.cursor.ui; - - - -public interface IModelVisitor { - - public void visitMovingBox(ProvisionURL box, Object argument); - - - -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/Model.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/Model.java deleted file mode 100644 index a6e815699..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/Model.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.ops4j.pax.cursor.ui; -public abstract class Model { - protected ProvisionURL parent; - protected String name; - protected String repoPath, level; - protected int treeLevel; - protected IDeltaListener listener = NullDeltaListener.getSoleInstance(); - - protected void fireAdd(Object added) { - listener.add(new DeltaEvent(added)); - } - - protected void fireRemove(Object removed) { - listener.remove(new DeltaEvent(removed)); - } - - public void setName(String name) { - this.name = name; - } - - public ProvisionURL getParent() { - return parent; - } - - /* The receiver should visit the toVisit object and - * pass along the argument. */ - public abstract void accept(IModelVisitor visitor, Object passAlongArgument); - - public String getName() { - return name; - } - - public void addListener(IDeltaListener listener) { - this.listener = listener; - } - - public Model(String title, String repoPath, String level,int treeLevel) { - this.name = title; - this.repoPath = repoPath; - this.level = level; - this.treeLevel=treeLevel; - } - - public Model() { - } - - public void removeListener(IDeltaListener listener) { - if(this.listener.equals(listener)) { - this.listener = NullDeltaListener.getSoleInstance(); - } - } - - - - public int getTreeLevel() { - return treeLevel; - } - - public void setTreeLevel(int treeLevel) { - this.treeLevel = treeLevel; - } - - public String getRepoPath() { - return repoPath; - } - - public void setRepoPath(String repoPath) { - this.repoPath = repoPath; - } - - public String getLevel() { - return level; - } - - public void setLevel(String level) { - this.level = level; - } - - public String getTitle() { - return name; - } - - -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/NullDeltaListener.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/NullDeltaListener.java deleted file mode 100644 index 8e6f8bb0e..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/NullDeltaListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.ops4j.pax.cursor.ui; -public class NullDeltaListener implements IDeltaListener { - protected static NullDeltaListener soleInstance = new NullDeltaListener(); - public static NullDeltaListener getSoleInstance() { - return soleInstance; - } - - /* - * @see IDeltaListener#add(DeltaEvent) - */ - public void add(DeltaEvent event) {} - - /* - * @see IDeltaListener#remove(DeltaEvent) - */ - public void remove(DeltaEvent event) {} - -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/OptionsBlock.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/OptionsBlock.java deleted file mode 100644 index 8f59cadf5..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/OptionsBlock.java +++ /dev/null @@ -1,284 +0,0 @@ -/* - * Copyright 2007 Alin Dreghiciu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.ops4j.pax.cursor.ui; - -import java.util.ArrayList; -import java.util.List; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; -import org.eclipse.debug.ui.ILaunchConfigurationTab; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.ops4j.pax.cursor.shared.Attribute; - -/** - * Options Composite of Pax Runner Eclipse Plugin (upper group). - * - * @author Alin Dreghiciu - * @since 0.2.0, December 16, 2007 - */ -public class OptionsBlock - extends CursorTabBlock -{ - - private final Combo m_logCombo; - // private final Button m_hotDeploymentButton; - private final Button m_overwriteSystemButton; - private final Button m_overwriteUserButton; - private final Button m_overwriteAllButton; - private final Button m_configProfileButton; - private final Button m_logProfileButton; - private final Button m_obrProfileButton; - private final Button m_webProfileButton; - private final Button m_warProfileButton; - private final Button m_springProfileButton; - private final Button m_dsProfileButton; - - /** - * @see Composite#Composite(Composite, int) - */ - public OptionsBlock( final Composite parent, final int style ) - { - super( parent, style ); - final GridLayout blockLayout = new GridLayout(); - blockLayout.numColumns = 2; - setLayout( blockLayout ); - - final Group optionsGroup = new Group( this, SWT.NONE ); - optionsGroup.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, false ) ); - optionsGroup.setText( "Options:" ); - final GridLayout optionsGroupLayout = new GridLayout(); - optionsGroupLayout.numColumns = 4; - optionsGroup.setLayout( optionsGroupLayout ); - - final SelectionListener updateNotifier = new SelectionAdapter() - { - public void widgetSelected( final SelectionEvent e ) - { - notifyUpdate(); - } - }; - - final Label overwriteLabel = new Label( optionsGroup, SWT.NONE ); - overwriteLabel.setLayoutData( new GridData( SWT.RIGHT, SWT.CENTER, false, false ) ); - overwriteLabel.setText( "Overwrite:" ); - - m_overwriteAllButton = new Button( optionsGroup, SWT.CHECK ); - m_overwriteAllButton.addSelectionListener( updateNotifier ); - m_overwriteAllButton.setText( "All" ); - - m_overwriteUserButton = new Button( optionsGroup, SWT.CHECK ); - m_overwriteUserButton.addSelectionListener( updateNotifier ); - m_overwriteUserButton.setText( "User" ); - - m_overwriteSystemButton = new Button( optionsGroup, SWT.CHECK ); - m_overwriteSystemButton.addSelectionListener( updateNotifier ); - m_overwriteSystemButton.setText( "System" ); - - - - - - final Label logLabel = new Label( optionsGroup, SWT.NONE ); - logLabel.setLayoutData( new GridData( SWT.RIGHT, SWT.CENTER, false, false ) ); - logLabel.setText( "Log:" ); - - - m_logCombo = new Combo( optionsGroup, SWT.READ_ONLY ); - m_logCombo.addSelectionListener( updateNotifier ); - m_logCombo.setItems( new String[]{ "TRACE", "DEBUG", "INFO", "WARN", "ERROR" } ); - final GridData logComboLayout = new GridData( SWT.LEFT, SWT.TOP, false, false ); - m_logCombo.setLayoutData( logComboLayout ); - - - // m_hotDeploymentButton = new Button( optionsGroup, SWT.CHECK ); - // m_hotDeploymentButton.addSelectionListener( updateNotifier ); - // m_hotDeploymentButton.setText( "Hot deployment" ); - - - final Group profilesGroup = new Group( this, SWT.NONE ); - profilesGroup.setLayoutData( new GridData( SWT.LEFT, SWT.FILL, false, false ) ); - profilesGroup.setText( "Profiles:" ); - final GridLayout profileGroupLayout = new GridLayout(); - profileGroupLayout.numColumns = 4; - profilesGroup.setLayout( profileGroupLayout ); - - m_logProfileButton = new Button( profilesGroup, SWT.CHECK ); - m_logProfileButton.addSelectionListener( updateNotifier ); - m_logProfileButton.setText( "log" ); - - m_webProfileButton = new Button( profilesGroup, SWT.CHECK ); - m_webProfileButton.addSelectionListener( updateNotifier ); - m_webProfileButton.setText( "web" ); - - m_warProfileButton = new Button( profilesGroup, SWT.CHECK ); - m_warProfileButton.addSelectionListener( updateNotifier ); - m_warProfileButton.setText( "war" ); - - m_springProfileButton = new Button(profilesGroup, SWT.CHECK); - m_springProfileButton.addSelectionListener( updateNotifier ); - m_springProfileButton.setText("spring"); - - m_configProfileButton = new Button( profilesGroup, SWT.CHECK ); - m_configProfileButton.addSelectionListener( updateNotifier ); - m_configProfileButton.setText( "config" ); - - m_obrProfileButton = new Button( profilesGroup, SWT.CHECK ); - m_obrProfileButton.addSelectionListener( updateNotifier ); - m_obrProfileButton.setText( "obr" ); - - m_dsProfileButton = new Button( profilesGroup, SWT.CHECK ); - m_dsProfileButton.addSelectionListener( updateNotifier ); - m_dsProfileButton.setText( "ds" ); - - new Label(profilesGroup, SWT.NONE); - } - - /** - * Initialize block. - * - * @see ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration) - */ - public void initializeFrom( final ILaunchConfiguration configuration ) - { - // default values - m_overwriteAllButton.setSelection( false ); - m_overwriteUserButton.setSelection( false ); - m_overwriteSystemButton.setSelection( false ); - m_logCombo.setText( "INFO" ); - try - { - // get overwrite options - m_overwriteAllButton.setSelection( configuration.getAttribute( Attribute.OVERWRITE_ALL, false ) ); - m_overwriteUserButton.setSelection( configuration.getAttribute( Attribute.OVERWRITE_USER, false ) ); - m_overwriteSystemButton.setSelection( configuration.getAttribute( Attribute.OVERWRITE_SYSTEM, false ) ); - // m_hotDeploymentButton.setSelection( configuration.getAttribute( Attribute.HOT_DEPLOYMENT, false ) ); - // get log option - m_logCombo.setText( configuration.getAttribute( Attribute.LOG_LEVEL, "INFO" ) ); - // get profiles option - final List profiles = configuration.getAttribute( Attribute.PROFILES, new ArrayList() ); - if( profiles != null && profiles.size() > 0 ) - { - m_configProfileButton.setSelection( profiles.contains( "config" ) ); - m_logProfileButton.setSelection( profiles.contains( "log" ) ); - m_obrProfileButton.setSelection( profiles.contains( "obr" ) ); - m_webProfileButton.setSelection( profiles.contains( "web" ) ); - m_warProfileButton.setSelection( profiles.contains( "war" ) ); - m_springProfileButton.setSelection( profiles.contains( "spring-dm" ) ); - m_dsProfileButton.setSelection( profiles.contains( "ds" ) ); - } - } - catch( CoreException ignore ) - { - // DebugUIPlugin.log(ignore.getStatus()); - } - } - - /** - * Saves block configurations attributes. - * - * @see ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy) - */ - public void performApply( final ILaunchConfigurationWorkingCopy configuration ) - { - // save overwrite options - configuration.setAttribute( Attribute.OVERWRITE_ALL, m_overwriteAllButton.getSelection() ); - configuration.setAttribute( Attribute.OVERWRITE_USER, m_overwriteUserButton.getSelection() ); - configuration.setAttribute( Attribute.OVERWRITE_SYSTEM, m_overwriteSystemButton.getSelection() ); - // configuration.setAttribute( Attribute.HOT_DEPLOYMENT, m_hotDeploymentButton.getSelection() ); - // save log option - configuration.setAttribute( Attribute.LOG_LEVEL, m_logCombo.getText() ); - // save profiles option - final StringBuffer profilesArg = new StringBuffer( "--profiles=" ); - List profiles = new ArrayList(); - if( m_configProfileButton.getSelection() ) - { - profiles.add( "config" ); - profilesArg.append( "config," ); - } - if( m_logProfileButton.getSelection() ) - { - profiles.add( "log" ); - profilesArg.append( "log," ); - } - if( m_obrProfileButton.getSelection() ) - { - profiles.add( "obr" ); - profilesArg.append( "obr," ); - } - if( m_webProfileButton.getSelection() ) - { - profiles.add( "web" ); - profilesArg.append( "web," ); - } - if( m_warProfileButton.getSelection() ) - { - profiles.add( "war" ); - profilesArg.append( "war," ); - } - if( m_springProfileButton.getSelection() ) - { - profiles.add( "spring-dm" ); - profilesArg.append( "spring-dm," ); - } - if( m_dsProfileButton.getSelection() ) - { - profiles.add( "ds" ); - profilesArg.append( "ds," ); - } - // maybe there is no profile selected so then remove the configuration attribute - if( profiles.size() == 0 ) - { - profiles = null; - } - configuration.setAttribute( Attribute.PROFILES, profiles ); - // finally, save arguments list - try - { - final List arguments = configuration.getAttribute( Attribute.RUN_ARGUMENTS, new ArrayList() ); - arguments.add( "--overwrite=" + m_overwriteAllButton.getSelection() ); - arguments.add( "--overwriteUserBundles=" + m_overwriteUserButton.getSelection() ); - arguments.add( "--overwriteSystemBundles=" + m_overwriteSystemButton.getSelection() ); - // arguments.add( "--hotDeployment=" + m_hotDeploymentButton.getSelection() ); - if( m_logCombo.getText() != null && m_logCombo.getText().trim().length() > 0 ) - { - arguments.add( "--log=" + m_logCombo.getText() ); - } - if( profiles != null ) - { - arguments.add( profilesArg.substring( 0, profilesArg.length() - 1 ) ); - } - configuration.setAttribute( Attribute.RUN_ARGUMENTS, arguments ); - } - catch( CoreException ignore ) - { - // DebugUIPlugin.log(ignore.getStatus());; - } - } - -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionBlock.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionBlock.java deleted file mode 100644 index 92b71f89d..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionBlock.java +++ /dev/null @@ -1,1307 +0,0 @@ -/* - * Copyright 2007 Alin Dreghiciu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.ops4j.pax.cursor.ui; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.Status; -import org.eclipse.debug.core.ILaunchConfiguration; -import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; -import org.eclipse.debug.ui.ILaunchConfigurationTab; -import org.eclipse.jface.dialogs.ErrorDialog; -import org.eclipse.jface.dialogs.InputDialog; -import org.eclipse.jface.dialogs.MessageDialog; -import org.eclipse.jface.viewers.CellEditor; -import org.eclipse.jface.viewers.CheckStateChangedEvent; -import org.eclipse.jface.viewers.CheckboxCellEditor; - -import org.eclipse.jface.viewers.CheckboxTreeViewer; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.ICheckStateListener; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ISelectionChangedListener; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.SelectionChangedEvent; -import org.eclipse.jface.viewers.TextCellEditor; -import org.eclipse.jface.viewers.TreeSelection; -import org.eclipse.jface.window.Window; -import org.eclipse.pde.internal.ui.PDEUIMessages; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Device; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.DirectoryDialog; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Listener; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.TableItem; - -import org.eclipse.swt.widgets.Tree; -import org.eclipse.swt.widgets.TreeItem; -import org.eclipse.ui.PlatformUI; -import org.ops4j.pax.cursor.shared.Attribute; - -import org.osgi.framework.AllServiceListener; - -/** - * Provisioning Composite of Pax Runner Eclipse Plugin (bottom group). - * - * @author Alin Dreghiciu - * @since 0.2.0, December 16, 2007 - */ -public class ProvisionBlock extends CursorTabBlock { - - private final CheckboxTreeViewer m_treeViewer; - private final Button m_editButton; - private final Button m_deleteButton; - private List expandedNodes = new ArrayList(); - private File m_lastUsedDir; - - - - - - /** - * @see Composite#Composite(Composite, int) - */ - public ProvisionBlock(Composite parent, int style) { - super(parent, style); - final GridLayout gridLayout = new GridLayout(); - setLayout(gridLayout); - - final Group provisioningGroup = new Group(this, SWT.NONE); - - provisioningGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, - true)); - provisioningGroup.setText("Provisioning:"); - final GridLayout provisioningGridLayout = new GridLayout(); - provisioningGridLayout.marginWidth = 0; - provisioningGridLayout.marginHeight = 0; - provisioningGridLayout.numColumns = 2; - provisioningGroup.setLayout(provisioningGridLayout); - - final Composite treeComposite = new Composite(provisioningGroup, - SWT.NONE); - - final GridData treeGridData = new GridData(SWT.FILL, SWT.FILL, true, - true); - - treeComposite.setLayoutData(treeGridData); - - final GridLayout tableGridLayout = new GridLayout(); - tableGridLayout.marginWidth = 0; - tableGridLayout.marginHeight = 0; - treeComposite.setLayout(tableGridLayout); - - m_treeViewer = new CheckboxTreeViewer(treeComposite, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER); - // m_treeViewer.getTree().getVerticalBar().setEnabled(true); - m_treeViewer.setContentProvider(new ProvisionContentProvider()); - m_treeViewer.setLabelProvider(new ProvisionLabelProvider()); - m_treeViewer.addCheckStateListener(new ICheckStateListener() { - public void checkStateChanged(final CheckStateChangedEvent event) { - // if(event.getChecked()){ - // m_treeViewer.setSubtreeChecked(event.getElement(), true); - // } - getExpandedNodes(); - ProvisionURL provisionURL = (ProvisionURL) event.getElement(); - provisionURL.setSelected(event.getChecked()); - ProvisionURL parent = provisionURL.getParent(); - if (parent != null) { - ProvisionURL[] children = parent.getChildren(); - if (children != null) { - boolean allChecked = true; - boolean allUnchecked = true; - for (int i = 0; i < children.length; i++) { - if (children[i] != provisionURL - && children[i].isSelected()) { - allUnchecked = false; - } else if (children[i] != provisionURL) { - allChecked = false; - } - } - if (provisionURL.isSelected()) { - allUnchecked = false; - } else { - allChecked = false; - } - if (allChecked) { - parent.setSelected(true); - m_treeViewer.setChecked(((ProvisionURL)event.getElement()).getParent(), true); - } - if (allUnchecked) { - parent.setSelected(false); - m_treeViewer.setChecked(((ProvisionURL)event.getElement()).getParent(), false); - } - } - } else { - - provisionURL.setSelected(event.getChecked()); - if (provisionURL.getChildren() != null) { - for (int i = 0; i < provisionURL.getChildren().length; i++) { - provisionURL.getChildren()[i].setSelected(event - .getChecked()); - - // m_treeViewer.setChecked(provisionURL.getChildren()[i], - // provisionURL.isSelected()); - } - m_treeViewer.setSubtreeChecked(event.getElement(), event.getChecked()); - } - } - //updateSelectedItems(); - updateStartImages(); - updateExpandedNodes(); - notifyUpdate(); - } - }); - m_treeViewer - .addSelectionChangedListener(new ISelectionChangedListener() { - public void selectionChanged(SelectionChangedEvent event) { - onTableSelectionChanged(event); - } - }); - m_treeViewer.addDoubleClickListener(new IDoubleClickListener() { - public void doubleClick(DoubleClickEvent event) { - if (!m_treeViewer.getSelection().isEmpty()) { - TreeSelection treeSel = (TreeSelection) m_treeViewer - .getSelection(); - if (((ProvisionURL) treeSel.getPaths()[treeSel.getPaths().length - 1] - .getLastSegment()).getParent() == null) { - return; - } else { - onEditButtonSelected(); - } - - } - } - }); - - final Tree tree = m_treeViewer.getTree(); - - tree.addMouseListener(new MouseListener() { - - public void mouseDown(MouseEvent e) { - for (TreeItem item : tree.getSelection()) { - if (item.getImage() != null) { - if ((e.x > item.getImageBounds(0).x) - && (e.x < (item.getImageBounds(0).x + item - .getImage().getBounds().width))) { - if ((e.y > item.getImageBounds(0).y) - && (e.y < (item.getImageBounds(0).y + item - .getImage().getBounds().height))) { - if (item.getParentItem() != null) { - if (((ProvisionURL) item.getData()) - .isStart()) { - ((ProvisionURL) item.getData()) - .setStart(false); - } else { - ((ProvisionURL) item.getData()) - .setStart(true); - } - updateStartImages(); - } else { - if (((ProvisionURL) item.getData()) - .isStart()) { - ((ProvisionURL) item.getData()) - .setStart(false); - } else { - ((ProvisionURL) item.getData()) - .setStart(true); - } - if (((ProvisionURL) item.getData()) - .getChildren() != null) { - for (int i = 0; i < ((ProvisionURL) item - .getData()).getChildren().length; i++) { - ProvisionURL provisionURL = ((ProvisionURL) item - .getData()).getChildren()[i]; - provisionURL - .setStart(((ProvisionURL) item - .getData()) - .isStart()); - } - updateStartImages(); - } - } - notifyUpdate(); - } - } - } - } - } - - public void mouseDoubleClick(MouseEvent e) { - // TODO Auto-generated method stub - - } - - public void mouseUp(MouseEvent e) { - // TODO Auto-generated method stub - - } - }); - - tree.addListener(SWT.Expand, new Listener() { - public void handleEvent(Event event) { - updateStartImages(); - } - }); - // table.setLinesVisible(true); - - // table.setHeaderVisible(true); - - tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - - // final TableColumn urlTableColumn = new TableColumn( table, SWT.NONE - // ); - // - // urlTableColumn.setWidth( 425 ); - // urlTableColumn.setText( "Provision from" ); - // - // final TableColumn startTableColumn = new TableColumn( table, - // SWT.CENTER ); - // startTableColumn.setWidth( 50 ); - // startTableColumn.setText( "Start" ); - // - // final TableColumn levelTableColumn = new TableColumn( table, - // SWT.CENTER ); - // levelTableColumn.setWidth( 70 ); - // levelTableColumn.setText( "Level" ); - // - // final TableColumn updateTableColumn = new TableColumn( table, - // SWT.CENTER ); - // updateTableColumn.setWidth( 50 ); - // updateTableColumn.setText( "Update" ); - - // final ProvisionCellModifier cellModifier = new - // ProvisionCellModifier(); - // cellModifier - // .setModifyListener(new ProvisionCellModifier.ModifyListener() { - // public void modified(Object element) { - // m_treeViewer.update(element, null); - // notifyUpdate(); - // } - // }); - // m_treeViewer.setCellModifier(cellModifier); - - // m_treeViewer.setCellEditors(new CellEditor[] { null, - // new CheckboxCellEditor(table), new TextCellEditor(table), - // new CheckboxCellEditor(table) }); - // m_treeViewer.setColumnProperties(new String[] { "url", "start", - // "level", "update" }); - - final Composite buttonsComposite = new Composite(provisioningGroup, - SWT.NONE); - final GridData butonsGridData = new GridData(SWT.LEFT, SWT.TOP, false, - false); - buttonsComposite.setLayoutData(butonsGridData); - buttonsComposite.setLayout(new GridLayout()); - - final Button addLevel = new Button(buttonsComposite, SWT.NONE); - addLevel.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); - addLevel.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(final SelectionEvent e) { - onAddLevelButtonSelected(); - } - }); - addLevel.setText("Add Level"); - - final Button addButton = new Button(buttonsComposite, SWT.NONE); - addButton - .setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false)); - addButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(final SelectionEvent e) { - onAddButtonSelected(); - } - }); - addButton.setText("Add URL"); - - final Button addBundleButton = new Button(buttonsComposite, SWT.NONE); - addBundleButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, - false)); - addBundleButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(final SelectionEvent e) { - onAddSingleFileButtonSelected("scan-bundle", new String[] { - "*.jar", "*.*" }, - new String[] { "Any Jar", "Any File" }); - } - }); - addBundleButton.setText("Add Bundle..."); - - final Button addFileButton = new Button(buttonsComposite, SWT.NONE); - addFileButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, - false)); - addFileButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(final SelectionEvent e) { - onAddSingleFileButtonSelected("scan-file", new String[] { - "*.bundles", "*.txt", "*.*" }, new String[] { - "Provision File", "TXT Provision File", "Any File" }); - } - }); - addFileButton.setText("Add File..."); - - final Button addPomButton = new Button(buttonsComposite, SWT.NONE); - addPomButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, - false)); - addPomButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(final SelectionEvent e) { - onAddSingleFileButtonSelected("scan-pom", new String[] { - "pom.xml", "*.pom", "*.*" }, new String[] { - "Maven POM", "Maven Repository POM", "Any File" }); - } - }); - addPomButton.setText("Add POM..."); - - final Button addDirButton = new Button(buttonsComposite, SWT.NONE); - addDirButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, - false)); - addDirButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(final SelectionEvent e) { - onAddDirButtonSelected(); - } - }); - addDirButton.setText("Add Dir..."); - - final Button addMavenButton = new Button(buttonsComposite, SWT.NONE); - addMavenButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, - false)); - addMavenButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(final SelectionEvent e) { - onAddMavenButtonSelected(); - } - }); - addMavenButton.setText("Add Maven..."); - - m_editButton = new Button(buttonsComposite, SWT.NONE); - m_editButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, - false)); - m_editButton.setEnabled(false); - m_editButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(final SelectionEvent e) { - onEditButtonSelected(); - } - }); - m_editButton.setText("Edit..."); - - m_deleteButton = new Button(buttonsComposite, SWT.NONE); - m_deleteButton.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, - false)); - m_deleteButton.setEnabled(false); - m_deleteButton.addSelectionListener(new SelectionAdapter() { - public void widgetSelected(final SelectionEvent e) { - onRemoveButtonSelected(); - - } - }); - m_deleteButton.setText("Delete"); -// m_treeViewer.addCheckStateListener(new ICheckStateListener() { -// -// public void checkStateChanged(CheckStateChangedEvent event) { -// // getExpandedNodes(); -//// if (((ProvisionURL) event.getElement()).isSelected()) { -//// ((ProvisionURL) event.getElement()).setSelected(false); -//// if (((ProvisionURL) event.getElement()).getParent() != null) { -//// ((ProvisionURL) event.getElement()).getParent() -//// .setSelected(false); -//// } -//// -//// } else { -//// ((ProvisionURL) event.getElement()).setSelected(true); -//// } -//// updateExpandedNodes(); -// -// } -// }); - - m_treeViewer.expandAll(); - - } - - private void getExpandedNodes() { - expandedNodes = new ArrayList(); - final TreeItem[] items = m_treeViewer.getTree().getItems(); - if (items != null && items.length > 0) { - for (int i = 0; i < items.length; i++) { - if (items[i].getExpanded()) { - expandedNodes.add(items[i].getText()); - } - } - } - } - - private void updateExpandedNodes() { - final TreeItem[] items = m_treeViewer.getTree().getItems(); - // expand nodes - - if (items != null && items.length > 0) { - for (int i = 0; i < items.length; i++) { - if (expandedNodes.contains(items[i].getText())) { - items[i].setExpanded(true); - } else { - items[i].setExpanded(false); - } - } - } - } - - private void updateSelectedItems() { - List provisionURLs = new ArrayList(); - List selectedURLs = new ArrayList(); - List expandedNodes = new ArrayList(); - - final TreeItem[] items = m_treeViewer.getTree().getItems(); - if (items != null && items.length > 0) { - for (int i = 0; i < items.length; i++) { - if (items[i].getExpanded()) { - expandedNodes.add(items[i]); - } - final ProvisionURL provisionURL1 = (ProvisionURL) items[i] - .getData(); - if (provisionURL1.isSelected()) { - selectedURLs.add(provisionURL1); - } - provisionURLs.add(provisionURL1); - if (provisionURL1.getUrl().startsWith("Level ")) { - - if (provisionURL1.getChildren() != null) { - ProvisionURL[] tmp = new ProvisionURL[provisionURL1 - .getChildren().length + 1]; - for (int j = 0; j < provisionURL1.getChildren().length; j++) { - tmp[j] = provisionURL1.getChildren()[j]; - - if (tmp[j].isSelected()) { - selectedURLs.add(tmp[j]); - } - } - - } else { - - } - } else { - if (provisionURL1.getChildren() != null) { - for (int j = 0; j < provisionURL1.getChildren().length; j++) { - if (provisionURL1.getChildren()[j].isSelected()) { - selectedURLs - .add(provisionURL1.getChildren()[j]); - } - } - } - } - } - } - m_treeViewer.setInput(provisionURLs); - - // m_treeViewer.update(provisionURL, null); - // m_treeViewer.expandAll(); - - updateStartImages(); - // m_treeViewer.add( provisionURL ); - - m_treeViewer.setCheckedElements(selectedURLs.toArray()); - - notifyUpdate(); - } - - /** - * Handles add level button push. - */ - - protected void onAddLevelButtonSelected() { - InputDialog levelDialog = new InputDialog(getShell(), - "Add level into OSGi framework", "Level number (e.g. 10):", - null, null); - if (levelDialog.open() != Window.OK) { - return; - } - - String levelValue = levelDialog.getValue().trim(); - try { - // check for integer value - if (Integer.parseInt(levelValue) >= 0) { - - // check for existing level - if (m_treeViewer.getTree().getItems() != null - && m_treeViewer.getTree().getItems().length > 0) { - boolean foundLevel = false; - for (int i = 0; i < m_treeViewer.getTree().getItems().length; i++) { - final ProvisionURL provisionURL1 = (ProvisionURL) m_treeViewer - .getTree().getItems()[i].getData(); - if (provisionURL1.getUrl().startsWith("Level") - && provisionURL1.getUrl().split(" ")[1] - .equals(levelValue)) { - foundLevel = true; - break; - } - } - if (!foundLevel) { - addLevel(levelValue); - } else { - Status status = new Status(IStatus.ERROR, - "org.universaal.tools.uAALRunner", 0, - "Level already exists", null); - ErrorDialog.openError(Display.getCurrent() - .getActiveShell(), "Error", "", status); - } - } - - } else { - Status status = new Status(IStatus.ERROR, - "org.universaal.tools.uAALRunner", 0, - "Level should be positive number", null); - ErrorDialog.openError(Display.getCurrent().getActiveShell(), - "Error", "", status); - } - - } catch (Exception ex) { - ex.printStackTrace(); - Status status = new Status(IStatus.ERROR, - "org.universaal.tools.uAALRunner", 0, ex.getMessage(), null); - ErrorDialog.openError(Display.getCurrent().getActiveShell(), - "Error", "Please enter an integer value.", status); - } - } - - /** - * Handles add button push. - */ - - protected void onAddButtonSelected() { - - InputDialog dialog = new InputDialog(getShell(), "Add bundle from URL", - "Bundle URL (e.g. OBR):", null, null); - if (dialog.open() != Window.OK) { - return; - } - - InputDialog levelDialog = new InputDialog(getShell(), - "Enter OSGi level number", "Level number (e.g. 2):", null, null); - if (levelDialog.open() != Window.OK) { - return; - } - String levelValue = levelDialog.getValue().trim(); - try { - // check for integer value - if (Integer.parseInt(levelValue) >= 0) { - if (!levelExists(levelValue)) { - addLevel(levelValue); - } - addURL(dialog.getValue().trim(), levelValue); - } else { - Status status = new Status(IStatus.ERROR, - "org.universaal.tools.uAALRunner", 0, - "Level should be positive number", null); - ErrorDialog.openError(Display.getCurrent().getActiveShell(), - "Error", "", status); - } - } catch (Exception ex) { - ex.printStackTrace(); - Status status = new Status(IStatus.ERROR, - "org.universaal.tools.uAALRunner", 0, ex.getMessage(), null); - ErrorDialog.openError(Display.getCurrent().getActiveShell(), - "Error", "Please enter an integer value.", status); - } - } - - /** - * Handles add bundle/file/pom button push. - */ - private void onAddSingleFileButtonSelected(final String scanner, - final String[] filterExtensions, final String[] filterNames) { - final FileDialog fileDialog = new FileDialog(getShell(), SWT.OPEN); - fileDialog.setText("File Selection"); - fileDialog.setFilterExtensions(filterExtensions); - fileDialog.setFilterNames(filterNames); - if (m_lastUsedDir != null) { - fileDialog.setFilterPath(m_lastUsedDir.getAbsolutePath()); - } - final String selected = fileDialog.open(); - - if (selected != null) { - final File selectedFile = new File(selected); - if (selectedFile.exists() && selectedFile.isFile()) { - m_lastUsedDir = selectedFile.getParentFile(); - InputDialog levelDialog = new InputDialog(getShell(), - "Enter OSGi level number", "Level number (e.g. 2):", - null, null); - if (levelDialog.open() != Window.OK) { - return; - } - String levelValue = levelDialog.getValue().trim(); - try { - if (Integer.parseInt(levelValue) >= 0) { - if (!levelExists(levelValue)) { - addLevel(levelValue); - } - addURL(scanner - + ":" - + selectedFile.getCanonicalFile().toURL() - .toExternalForm(), - levelDialog.getValue()); - } else { - Status status = new Status(IStatus.ERROR, - "org.universaal.tools.uAALRunner", 0, - "Level should be positive number", null); - ErrorDialog.openError(Display.getCurrent() - .getActiveShell(), "Error", "", status); - } - - } catch (Exception ex) { - ex.printStackTrace(); - Status status = new Status(IStatus.ERROR, - "org.universaal.tools.uAALRunner", 0, - ex.getMessage(), null); - ErrorDialog.openError( - Display.getCurrent().getActiveShell(), "Error", - "Please enter an integer value.", status); - } - } - } - } - - /** - * Handles add dir button push. - */ - protected void onAddDirButtonSelected() { - final DirectoryDialog dialog = new DirectoryDialog(getShell()); - dialog.setText(PDEUIMessages.BaseBlock_dirSelection); - dialog.setMessage(PDEUIMessages.BaseBlock_dirChoose); - if (m_lastUsedDir != null) { - dialog.setFilterPath(m_lastUsedDir.getAbsolutePath()); - } - final String selected = dialog.open(); - - if (selected != null) { - final File selectedFile = new File(selected); - if (selectedFile.exists() && selectedFile.isDirectory()) { - m_lastUsedDir = selectedFile; - InputDialog levelDialog = new InputDialog(getShell(), - "Enter OSGi level number", "Level number (e.g. 2):", - null, null); - if (levelDialog.open() != Window.OK) { - return; - } - String levelValue = levelDialog.getValue().trim(); - try { - if (Integer.parseInt(levelValue) >= 0) { - if (!levelExists(levelValue)) { - addLevel(levelValue); - } - addURL("scan-dir:" - + selectedFile.getCanonicalFile().toURL() - .toExternalForm(), - levelDialog.getValue()); - } else { - Status status = new Status(IStatus.ERROR, - "org.universaal.tools.uAALRunner", 0, - "Level should be positive number", null); - ErrorDialog.openError(Display.getCurrent() - .getActiveShell(), "Error", "", status); - } - - } catch (Exception ex) { - ex.printStackTrace(); - Status status = new Status(IStatus.ERROR, - "org.universaal.tools.uAALRunner", 0, - ex.getMessage(), null); - ErrorDialog.openError( - Display.getCurrent().getActiveShell(), "Error", - "Please enter an integer value.", status); - } - } - } - } - - private void onAddMavenButtonSelected() { - MessageDialog - .openInformation( - getShell(), - "Information", - "Not yet implemented, but will allow selection of a Maven artifact from local or remote repository"); - - - - - } - - /** - * Handles edit button push. - */ - protected void onEditButtonSelected() { - final IStructuredSelection sel = (IStructuredSelection) m_treeViewer - .getSelection(); - - if (sel == null || sel.isEmpty()) { - return; - } - final ProvisionURL provisionURL = (ProvisionURL) sel.iterator().next(); - InputDialog dialog = new InputDialog(getShell(), "Add", - "Provision from", provisionURL.getUrl(), null); - if (dialog.open() != Window.OK) { - return; - } - updateURL(provisionURL, dialog.getValue()); - } - - /** - * Handles delete button push. - */ - private void onRemoveButtonSelected() { - getExpandedNodes(); - final IStructuredSelection sel = (IStructuredSelection) m_treeViewer - .getSelection(); - if (sel == null || sel.isEmpty()) { - return; - } - for (Iterator i = sel.iterator(); i.hasNext();) { - findAndDeleteProvisionUrl((ProvisionURL) i.next()); - } - updateExpandedNodes(); - } - - private void findAndDeleteProvisionUrl(ProvisionURL provisionURL) { - List provisionURLs = new ArrayList(); - List selectedURLs = new ArrayList(); - final TreeItem[] items = m_treeViewer.getTree().getItems(); - if (items != null && items.length > 0) { - for (int i = 0; i < items.length; i++) { - final ProvisionURL provisionURL1 = (ProvisionURL) items[i] - .getData(); - if (provisionURL != provisionURL1) { - if (provisionURL1.isSelected()) { - selectedURLs.add(provisionURL1); - } - provisionURLs.add(provisionURL1); - - if (provisionURL1.getChildren() != null) { - for (int j = 0; j < provisionURL1.getChildren().length; j++) { - ProvisionURL provisionURL2 = provisionURL1 - .getChildren()[j]; - if (provisionURL != provisionURL2) { - if (provisionURL1.isSelected()) { - selectedURLs.add(provisionURL1); - } - } else { - ProvisionURL[] provisionChildren = new ProvisionURL[provisionURL1 - .getChildren().length - 1]; - int kk = 0; - for (int k = 0; k < provisionURL1.getChildren().length; k++) { - if (provisionURL1.getChildren()[k] != provisionURL) { - provisionChildren[kk] = provisionURL1 - .getChildren()[k]; - kk++; - } - } - provisionURL1.setChildren(provisionChildren); - break; - } - } - } - } - } - m_treeViewer.setInput(provisionURLs); - m_treeViewer.expandAll(); - updateStartImages(); - if (selectedURLs.size() > 0) { - m_treeViewer.setCheckedElements(selectedURLs.toArray()); - } - notifyUpdate(); - } - - } - - /** - * Handles a change on a selection in provision table. - * - * @param event - * selection changed event - */ - private void onTableSelectionChanged(final SelectionChangedEvent event) { - try { - int size = ((IStructuredSelection) event.getSelection()).size(); - if (!((ProvisionURL) ((IStructuredSelection) event.getSelection()) - .getFirstElement()).getUrl().startsWith("Level ") - && ((ProvisionURL) ((IStructuredSelection) event - .getSelection()).getFirstElement()).getParent() != null) { - m_editButton.setEnabled(size == 1); - } else { - m_editButton.setEnabled(false); - } - m_deleteButton.setEnabled(size > 0); - } catch (Exception ex) { - m_editButton.setEnabled(false); - m_deleteButton.setEnabled(false); - - } - } - - private void addLevel(final String level) { - getExpandedNodes(); - ProvisionURL provisionURL = new ProvisionURL("Level " + level, false, - true, null, false); - List provisionURLs = new ArrayList(); - List selectedURLs = new ArrayList(); - if (m_treeViewer.getTree().getItems() != null - && m_treeViewer.getTree().getItems().length > 0) { - for (int i = 0; i < m_treeViewer.getTree().getItems().length; i++) { - final ProvisionURL provisionURL1 = (ProvisionURL) m_treeViewer - .getTree().getItems()[i].getData(); - provisionURLs.add(provisionURL1); - if (provisionURL1.isSelected()) { - selectedURLs.add(provisionURL1); - } - if (provisionURL1.getChildren() != null) { - for (int j = 0; j < provisionURL1.getChildren().length; j++) { - ProvisionURL provisionURL2 = provisionURL1 - .getChildren()[j]; - if (provisionURL2.isSelected()) { - selectedURLs.add(provisionURL2); - } - } - } - } - } - provisionURLs.add(provisionURL); - m_treeViewer.setInput(provisionURLs); - m_treeViewer.expandAll(); - updateExpandedNodes(); - // m_treeViewer.expandAll(); - - updateStartImages(); - if (selectedURLs.size() > 0) { - m_treeViewer.setCheckedElements(selectedURLs.toArray()); - } - notifyUpdate(); - } - - private boolean levelExists(String level) { - final TreeItem[] items = m_treeViewer.getTree().getItems(); - if (items != null && items.length > 0) { - for (int i = 0; i < items.length; i++) { - final ProvisionURL provisionURL1 = (ProvisionURL) items[i] - .getData(); - if (provisionURL1.getUrl().startsWith("Level ") - && provisionURL1.getUrl().endsWith(level)) { - return true; - } - } - } - return false; - } - - /** - * Creates a provision url. - * - * @param url - * created url - */ - private void addURL(final String url, final String level) { - List provisionURLs = new ArrayList(); - List selectedURLs = new ArrayList(); - getExpandedNodes(); - ProvisionURL provisionURL = new ProvisionURL(url, true, true, null, - false); - provisionURL.setStartLevel(Integer.parseInt(level)); - provisionURL.setSelected(true); - final TreeItem[] items = m_treeViewer.getTree().getItems(); - if (items != null && items.length > 0) { - for (int i = 0; i < items.length; i++) { - final ProvisionURL provisionURL1 = (ProvisionURL) items[i] - .getData(); - if (provisionURL1.isSelected()) { - selectedURLs.add(provisionURL1); - } - provisionURLs.add(provisionURL1); - if (provisionURL1.getUrl().startsWith("Level ") - && provisionURL1.getUrl().endsWith(level)) { - // provisionURL1.add(provisionURL); - if (provisionURL1.getChildren() != null) { - ProvisionURL[] tmp = new ProvisionURL[provisionURL1 - .getChildren().length + 1]; - for (int j = 0; j < provisionURL1.getChildren().length; j++) { - tmp[j] = provisionURL1.getChildren()[j]; - if (tmp[j].isSelected()) { - selectedURLs.add(tmp[j]); - } - } - tmp[provisionURL1.getChildren().length] = provisionURL; - provisionURL.setParent(provisionURL1); - provisionURL1.setChildren(tmp); - } else { - provisionURL1 - .setChildren(new ProvisionURL[] { provisionURL }); - provisionURL.setParent(provisionURL1); - provisionURL1.setSelected(true); - selectedURLs.add(provisionURL1); - } - selectedURLs.add(provisionURL); - } else { - if (provisionURL1.getChildren() != null) { - for (int j = 0; j < provisionURL1.getChildren().length; j++) { - if (provisionURL1.getChildren()[j].isSelected()) { - selectedURLs - .add(provisionURL1.getChildren()[j]); - } - } - } - } - } - } - m_treeViewer.setInput(provisionURLs); - - // m_treeViewer.update(provisionURL, null); - m_treeViewer.expandAll(); - updateExpandedNodes(); - updateStartImages(); - // m_treeViewer.add( provisionURL ); - if (selectedURLs.size() != 0) { - m_treeViewer.setCheckedElements(selectedURLs.toArray()); - } - notifyUpdate(); - } - - /** - * Updates a provision url after edit. - * - * @param provisionURL - * to be updated - * @param url - * new url - */ - private void updateURL(final ProvisionURL provisionURL, final String url) { - provisionURL.setUrl(url); - m_treeViewer.update(provisionURL, null); - notifyUpdate(); - } - - private boolean checkIfLevelExists(List provisionURLs, String level) { - - for (int i = 0; i < provisionURLs.size(); i++) { - if (provisionURLs.get(i) != null - - && ((ProvisionURL) provisionURLs.get(i)).getUrl() - .startsWith("Level") - && - - ((ProvisionURL) provisionURLs.get(i)).getUrl().split(" ")[1] - .equals(level)) { - return true; - } - } - return false; - - } - - /** - * Initialize block. - * - * @see ILaunchConfigurationTab#initializeFrom(ILaunchConfiguration) - */ - - public void initializeFrom(final ILaunchConfiguration configuration) { - try { - final Map toRestore = (Map) configuration.getAttribute( - Attribute.PROVISION_ITEMS, new HashMap()); - final List provisionURLs = new ArrayList(); - final List selectedURLs = new ArrayList(); - - for (int i = 1; i < 8; i++) { - ProvisionURL level = new ProvisionURL(); - level.setUrl("Level " + i); - level.setParent(null); - level.setSelected(false); - level.setStart(false); - provisionURLs.add(level); - } - - // create level nodes - for (Iterator iterator = toRestore.entrySet().iterator(); iterator - .hasNext();) { - final Map.Entry entry = (Map.Entry) iterator.next(); - final ProvisionURL provisionURL = new ProvisionURL(); - provisionURL.setUrl((String) entry.getKey()); - - if (entry.getValue() != null) { - final String[] options = ((String) entry.getValue()) - .split("@"); - // first option: selected - boolean - if (options.length >= 1) { - provisionURL.setSelected(Boolean.valueOf(options[0]) - .booleanValue()); - } - // second option: start - boolean - if (options.length >= 2) { - provisionURL.setStart(Boolean.valueOf(options[1]) - .booleanValue()); - } - // third option: start level - integer ("null" if not - // specified) - if (options.length >= 3 && !options[2].equals("null")) { - try { - provisionURL.setStartLevel(Integer - .valueOf(options[2])); - - } catch (NumberFormatException ignore) { - // ignore. actually it should not happen - } - } - // forth option: update - boolean - if (options.length >= 4) { - provisionURL.setUpdate(Boolean.valueOf(options[3]) - .booleanValue()); - } - } - if (provisionURL.getStartLevel() != null) { - if (!checkIfLevelExists(provisionURLs, provisionURL - .getStartLevel().toString())) { - ProvisionURL level = new ProvisionURL(); - level.setUrl("Level " + provisionURL.getStartLevel()); - level.setParent(null); - level.setSelected(false); - level.setStart(false); - - provisionURLs.add(level); - - } - } - } - - for (Iterator iterator = toRestore.entrySet().iterator(); iterator - .hasNext();) { - final Map.Entry entry = (Map.Entry) iterator.next(); - final ProvisionURL provisionURL = new ProvisionURL(); - provisionURL.setUrl((String) entry.getKey()); - - if (entry.getValue() != null) { - final String[] options = ((String) entry.getValue()) - .split("@"); - // first option: selected - boolean - if (options.length >= 1) { - provisionURL.setSelected(Boolean.valueOf(options[0]) - .booleanValue()); - } - // second option: start - boolean - if (options.length >= 2) { - provisionURL.setStart(Boolean.valueOf(options[1]) - .booleanValue()); - } - // third option: start level - integer ("null" if not - // specified) - if (options.length >= 3 && !options[2].equals("null")) { - try { - provisionURL.setStartLevel(Integer - .valueOf(options[2])); - - } catch (NumberFormatException ignore) { - // ignore. actually it should not happen - } - } - // forth option: update - boolean - if (options.length >= 4) { - provisionURL.setUpdate(Boolean.valueOf(options[3]) - .booleanValue()); - } - } - // search for parent level node - boolean levelFound = false; - for (int i = 0; i < provisionURLs.size(); i++) { - ProvisionURL p = (ProvisionURL) provisionURLs.get(i); - if (p.getParent() == null) { - - if (provisionURL.getStartLevel() != null - && provisionURL.getStartLevel().intValue() == (Integer - .parseInt(p.getUrl().split(" ")[1]))) { - levelFound = true; - p.add(provisionURL); - provisionURL.setParent(p); - if (p.getChildren() != null) { - ProvisionURL[] tmp = new ProvisionURL[p - .getChildren().length + 1]; - for (int j = 0; j < p.getChildren().length; j++) { - tmp[j] = p.getChildren()[j]; - } - tmp[p.getChildren().length] = provisionURL; - p.setChildren(tmp); - } else { - p.setChildren(new ProvisionURL[] { provisionURL }); - } - if (provisionURL.isSelected()) { - selectedURLs.add(provisionURL); - // m_treeViewer.setChecked(provisionURL, true); - } - } - - } - } - - // provisionURLs.add( provisionURL ); - // if( provisionURL.isSelected() ) - // { - // selectedURLs.add( provisionURL ); - // } - } - m_treeViewer.setInput(provisionURLs); - m_treeViewer.expandAll(); - updateStartImages(); - - // check if level nodes have all children checked - for (int i = 0; i < provisionURLs.size(); i++) { - ProvisionURL provisionURL = (ProvisionURL) provisionURLs.get(i); - boolean allSelected = true; - if (provisionURL.getChildren() != null) { - for (int j = 0; j < provisionURL.getChildren().length; j++) { - if (!provisionURL.getChildren()[j].isSelected()) { - allSelected = false; - } - } - } else { - allSelected = false; - } - if (allSelected) { - selectedURLs.add(provisionURL); - provisionURL.setSelected(true); - } - } - if (selectedURLs.size() > 0) { - m_treeViewer.setCheckedElements(selectedURLs.toArray()); - } - } catch (CoreException ignore) { - // DebugUIPlugin.log(ignore.getStatus()); - } - } - - private void updateStartImages() { - ImageData ideaImage = new ImageData(getClass().getResourceAsStream( - "/images/start.jpg")); - Image image = new Image(Display.getCurrent(), ideaImage); - ImageData ideaImage2 = new ImageData(getClass().getResourceAsStream( - "/images/noStart.jpg")); - Image image2 = new Image(Display.getCurrent(), ideaImage2); - - for (int i = 0; i < m_treeViewer.getTree().getItems().length; i++) { - TreeItem it = m_treeViewer.getTree().getItems()[i]; - boolean allChildrenStarted = true; - boolean allChildrenNotStarted = true; - for (int j = 0; j < it.getItemCount(); j++) { - TreeItem it2 = it.getItems()[j]; - - if (((ProvisionURL) it2.getData()) != null - && ((ProvisionURL) it2.getData()).isStart()) { - allChildrenNotStarted = false; - it2.setImage(image); - } else { - allChildrenStarted = false; - it2.setImage(image2); - } - } - if (allChildrenStarted) { - it.setImage(image); - ((ProvisionURL) it.getData()).setStart(true); - } else { - it.setImage(image2); - ((ProvisionURL) it.getData()).setStart(false); - } - if (it.getParentItem() == null && it.getItemCount() == 0) { - it.setImage(image2); - ((ProvisionURL) it.getData()).setStart(false); - } - } - } - - /** - * Saves block configurations attributes.<br/> - * It will save a map where the key is the url and the value are the other - * options as selected@start@start_level@update. - * - * @see ILaunchConfigurationTab#performApply(ILaunchConfigurationWorkingCopy) - */ - public void performApply(final ILaunchConfigurationWorkingCopy configuration) { - // finally, save arguments list - List arguments = null; - try { - arguments = configuration.getAttribute(Attribute.RUN_ARGUMENTS, - (List) null); - } catch (CoreException ignore) { - // DebugUIPlugin.log(ignore.getStatus());; - } - final TreeItem[] items = m_treeViewer.getTree().getItems(); - Map toSave = null; - if (items != null && items.length > 0) { - if (arguments == null) { - arguments = new ArrayList(); - } - toSave = new HashMap(); - for (int i = 0; i < items.length; i++) { - final ProvisionURL provisionURL1 = (ProvisionURL) items[i] - .getData(); - if (provisionURL1.getChildren() != null) { - for (int j = 0; j < provisionURL1.getChildren().length; j++) { - ProvisionURL provisionURL = provisionURL1.getChildren()[j]; - if (!provisionURL.getUrl().startsWith("Level ")) { - StringBuffer options = new StringBuffer() - .append(m_treeViewer - .getChecked(provisionURL)) - .append("@").append(provisionURL.isStart()) - .append("@") - .append(provisionURL.getStartLevel()) - .append("@") - .append(provisionURL.isUpdate()); - toSave.put(provisionURL.getUrl(), - options.toString()); - if (provisionURL.isSelected()) { - final StringBuffer provisionFrom = new StringBuffer( - provisionURL.getUrl()); - if (provisionURL.getStartLevel() != null) { - provisionFrom.append("@").append( - provisionURL.getStartLevel()); - } - if (!provisionURL.isStart()) { - provisionFrom.append("@nostart"); - } - if (provisionURL.isUpdate()) { - provisionFrom.append("@update"); - } - arguments.add(provisionFrom.toString()); - } - } - } - } - } - } - configuration.setAttribute(Attribute.PROVISION_ITEMS, toSave); - configuration.setAttribute(Attribute.RUN_ARGUMENTS, arguments); - } - -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionCellModifier.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionCellModifier.java deleted file mode 100644 index b9e503f41..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionCellModifier.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright 2007 Alin Dreghiciu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.ops4j.pax.cursor.ui; - -import org.eclipse.jface.viewers.ICellModifier; -import org.eclipse.swt.widgets.TableItem; - -/** - * Cell Modifier for provisioning table.<br/> - * Expects the modified elements to be Provisioning URLS's and column have the "right" properties set. - * - * @author Alin Dreghiciu - * @since 0.2.0, December 17, 2007 - */ -public class ProvisionCellModifier implements ICellModifier -{ - - /** - * Modify listener. - */ - private ModifyListener m_modifyListener; - - /** - * All cells beside "url" are modifiable. - * - * @see ICellModifier#canModify(Object, String) - */ - public boolean canModify( Object element, String property ) - { - return !"url".equals( property ); - } - - /** - * @see ICellModifier#getValue(Object, String) - */ - public Object getValue( final Object element, final String property ) - { - if( element instanceof ProvisionURL ) - { - final ProvisionURL provisionURL = (ProvisionURL) element; - if( "start".equals( property ) ) - { - return Boolean.valueOf( provisionURL.isStart() ); - } - if( "level".equals( property ) ) - { - if( provisionURL.getStartLevel() == null ) - { - return ""; - } - return provisionURL.getStartLevel().toString(); - } - if( "update".equals( property ) ) - { - return Boolean.valueOf( provisionURL.isUpdate() ); - } - } - return null; - } - - /** - * @see ICellModifier#modify(Object, String, Object) - */ - public void modify( final Object element, final String property, final Object value ) - { - final TableItem item = (TableItem) element; - if( item.getData() instanceof ProvisionURL ) - { - final ProvisionURL provisionURL = (ProvisionURL) item.getData(); - if( "start".equals( property ) ) - { - provisionURL.setStart( ( (Boolean) value ).booleanValue() ); - } - if( "level".equals( property ) ) - { - if( value == null || ( (String) value ).trim().length() == 0 ) - { - provisionURL.setStartLevel( null ); - } - else - { - try - { - provisionURL.setStartLevel( new Integer( (String) value ) ); - } catch( NumberFormatException ignore ) - { - // just not set the value - } - } - } - if( "update".equals( property ) ) - { - provisionURL.setUpdate( ( (Boolean) value ).booleanValue() ); - } - if( m_modifyListener != null ) - { - m_modifyListener.modified( item.getData() ); - } - } - } - - /** - * Sets the modify listener. - * - * @param modifyListener a listener - */ - public void setModifyListener( final ModifyListener modifyListener ) - { - m_modifyListener = modifyListener; - } - - /** - * A modify listener is notified on succesfull update of a modified cell. - */ - public interface ModifyListener - { - - /** - * Notification on succesfull update. - * - * @param element modified element. - */ - void modified( Object element ); - - } - -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionContentProvider.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionContentProvider.java deleted file mode 100644 index 2441c842c..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionContentProvider.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2007 Alin Dreghiciu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.ops4j.pax.cursor.ui; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; - -import org.eclipse.jface.viewers.IContentProvider; -import org.eclipse.jface.viewers.IStructuredContentProvider; -import org.eclipse.jface.viewers.ITreeContentProvider; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.pde.internal.ui.elements.DefaultContentProvider; - -/** - * Content provider for provisioning table.<br/> - * Expects the input element to be a list of Provisioning URLS's. - * - * @author Alin Dreghiciu - * @since 0.2.0, December 16, 2007 - */ -public class ProvisionContentProvider - // extends DefaultContentProvider - implements ITreeContentProvider -{ - - public Object[] getChildren(Object arg0) { - return ((ProvisionURL) arg0).getChildren(); - } - - public Object getParent(Object arg0) { - return ((ProvisionURL) arg0).getParent(); - } - - public boolean hasChildren(Object arg0) { - Object[] obj = getChildren(arg0); - return obj == null ? false : obj.length > 0; - } - - public Object[] getElements(Object arg0) { - // return File.listRoots(); - if (arg0 instanceof ProvisionURL){ - return getChildren(arg0); - } - else - { - ArrayList ar=(ArrayList)arg0; - return ar.toArray(); - } - } - - public void dispose() { - } - - public void inputChanged(Viewer arg0, Object arg1, Object arg2) { - } - - - - - - - /** - * Returns an array of ProvisionURL's. - * - * @see IStructuredContentProvider#getElements(Object) - */ -// public Object[] getElements( final Object inputElement ) -// { -// if( !( inputElement instanceof List ) ) -// { -// throw new IllegalArgumentException( "Input element must be List of " + ProvisionURL.class.getName() ); -// } -// //return ( (List) inputElement ).toArray(); -// return new Object[0]; -// } - -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionLabelProvider.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionLabelProvider.java deleted file mode 100644 index 25e7d9af7..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionLabelProvider.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright 2007 Alin Dreghiciu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.ops4j.pax.cursor.ui; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.viewers.ITableLabelProvider; -import org.eclipse.jface.viewers.LabelProvider; -import org.eclipse.swt.graphics.Image; - - - -/** - * Label provider for provisioning table. - * - * @author Alin Dreghiciu - * @since 0.2.0, December 16, 2007 - */ -public class ProvisionLabelProvider - extends LabelProvider - // implements ITableLabelProvider -{ - private Map imageCache = new HashMap(11); - /* - * @see ILabelProvider#getImage(Object) - */ - public Image getImage(Object element) { - ImageDescriptor descriptor = null; - - - //obtain the cached image corresponding to the descriptor - Image image = (Image)imageCache.get(descriptor); - - return image; - } - - /* - * @see ILabelProvider#getText(Object) - */ - public String getText(Object element) { - if (element instanceof ProvisionURL) { - if(((ProvisionURL)element).getUrl() == null) { - return "Box"; - } else { - return ((ProvisionURL)element).getUrl(); - } - - } else - if(element instanceof String){ - return (String)element; - } - else{ - throw unknownElement(element); - } - } - - public void dispose() { - for (Iterator i = imageCache.values().iterator(); i.hasNext();) { - ((Image) i.next()).dispose(); - } - imageCache.clear(); - } - - protected RuntimeException unknownElement(Object element) { - return new RuntimeException("Unknown type of element in tree of type " + element.getClass().getName()); - } - - -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionURL.java b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionURL.java deleted file mode 100644 index 3d547b9db..000000000 --- a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/src/main/java/org/ops4j/pax/cursor/ui/ProvisionURL.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2007 Alin Dreghiciu. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.ops4j.pax.cursor.ui; - -import java.util.ArrayList; - - - - - -/** - * TODO Add JavaDoc - * - * @author Alin Dreghiciu - * @since 0.2.0, December 16, 2007 - */ -public class ProvisionURL extends Model -{ - - private String m_url; - private boolean m_selected; - private boolean m_start; - private Integer m_startLevel; - private boolean m_update; - private ProvisionURL parent; - private ProvisionURL[] children; - private static IModelVisitor adder = new Adder(); - protected ArrayList<ProvisionURL> boxes; - - private static class Adder implements IModelVisitor { - /* - * @see ModelVisitorI#visitBoardgame(BoardGame) - */ - - /* - * @see ModelVisitorI#visitBook(MovingBox) - */ - - /* - * @see ModelVisitorI#visitMovingBox(MovingBox) - */ - - /* - * @see ModelVisitorI#visitBoardgame(BoardGame, Object) - */ - - - /* - * @see ModelVisitorI#visitMovingBox(MovingBox, Object) - */ - public void visitMovingBox(ProvisionURL box, Object argument) { - ((ProvisionURL) argument).addProvisionURL(box); - } - - - - } - - - protected void addProvisionURL(ProvisionURL box) { - boxes.add(box); - box.parent = this; - fireAdd(box); - } - - - public ProvisionURL() - { - boxes = new ArrayList<ProvisionURL>(); - m_selected = true; - m_start = true; - m_update = false; - } - - public ProvisionURL( final String url, final boolean selected, boolean start, final Integer startLevel, - final boolean update ) - { - m_url = url; - m_selected = selected; - m_start = start; - m_startLevel = startLevel; - m_update = update; - } - - public String getUrl() - { - return m_url; - } - - public void setUrl( String url ) - { - this.m_url = url; - } - - public boolean isSelected() - { - return m_selected; - } - - public void setSelected( boolean selected ) - { - this.m_selected = selected; - } - - public boolean isStart() - { - return m_start; - } - - public void setStart( boolean start ) - { - this.m_start = start; - } - - public Integer getStartLevel() - { - return m_startLevel; - } - - public void setStartLevel( Integer startLevel ) - { - this.m_startLevel = startLevel; - } - - public boolean isUpdate() - { - return m_update; - } - - public void setUpdate( boolean update ) - { - this.m_update = update; - } - - public ProvisionURL getParent() { - return parent; - } - - public void setParent(ProvisionURL parent) { - this.parent = parent; - } - - public ProvisionURL[] getChildren() { - return children; - } - - public void setChildren(ProvisionURL[] children) { - this.children = children; - } - - public void add(Model toAdd) { - toAdd.accept(adder, this); - } - - - /* - * @see Model#accept(ModelVisitorI, Object) - */ - public void accept(IModelVisitor visitor, Object passAlongArgument) { - visitor.visitMovingBox(this, passAlongArgument); - } - -} diff --git a/uAALRunner/org.ops4j.pax.runner.eclipse.ui/swt-grouplayout.jar b/uAALRunner/org.ops4j.pax.runner.eclipse.ui/swt-grouplayout.jar deleted file mode 100644 index c41975e3b7acf4a890c422fdcd8b6648d57e1b19..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40320 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ˑ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 X8W;~fUZI1W(4TAQ@r)t<^RNE{$rtLJ -- GitLab