From 1e31aef973e1b3970ce15b4238d79ff48e1cdb1b Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Mon, 6 Feb 2012 09:04:43 -0800 Subject: [PATCH 01/20] Add Eclipse project metadata --- de.vonloesch.pdf4eclipse/.classpath | 7 +++++++ de.vonloesch.pdf4eclipse/.project | 28 ++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 de.vonloesch.pdf4eclipse/.classpath create mode 100644 de.vonloesch.pdf4eclipse/.project diff --git a/de.vonloesch.pdf4eclipse/.classpath b/de.vonloesch.pdf4eclipse/.classpath new file mode 100644 index 0000000..64c5e31 --- /dev/null +++ b/de.vonloesch.pdf4eclipse/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/de.vonloesch.pdf4eclipse/.project b/de.vonloesch.pdf4eclipse/.project new file mode 100644 index 0000000..19a2c69 --- /dev/null +++ b/de.vonloesch.pdf4eclipse/.project @@ -0,0 +1,28 @@ + + + de.vonloesch.pdf4eclipse + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + From 32a984d8f7fdd6fe70c6e11f4c012f08679f9ec3 Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Mon, 6 Feb 2012 09:10:18 -0800 Subject: [PATCH 02/20] Fix Eclipse project metadata --- de.vonloesch.pdf4eclipse/.classpath | 4 +++- de.vonloesch.pdf4eclipse/build.properties | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/de.vonloesch.pdf4eclipse/.classpath b/de.vonloesch.pdf4eclipse/.classpath index 64c5e31..b8642e7 100644 --- a/de.vonloesch.pdf4eclipse/.classpath +++ b/de.vonloesch.pdf4eclipse/.classpath @@ -1,7 +1,9 @@ - + + + diff --git a/de.vonloesch.pdf4eclipse/build.properties b/de.vonloesch.pdf4eclipse/build.properties index 16e1348..da2be38 100644 --- a/de.vonloesch.pdf4eclipse/build.properties +++ b/de.vonloesch.pdf4eclipse/build.properties @@ -6,4 +6,5 @@ bin.includes = plugin.xml,\ icons/,\ lib/,\ OSGI-INF/l10n/bundle.properties - + lib/jbig2.jar,\ + lib/PDFrenderer.jar From 560285a787b3395fd719dd2f10d4c6add756ca81 Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Wed, 8 Feb 2012 13:12:20 -0800 Subject: [PATCH 03/20] BREE set to JavaSE-1.6 --- de.vonloesch.pdf4eclipse/.classpath | 18 +++++++++--------- .../.settings/org.eclipse.jdt.core.prefs | 8 ++++++++ 2 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 de.vonloesch.pdf4eclipse/.settings/org.eclipse.jdt.core.prefs diff --git a/de.vonloesch.pdf4eclipse/.classpath b/de.vonloesch.pdf4eclipse/.classpath index b8642e7..c09b3dc 100644 --- a/de.vonloesch.pdf4eclipse/.classpath +++ b/de.vonloesch.pdf4eclipse/.classpath @@ -1,9 +1,9 @@ - - - - - - - - - + + + + + + + + + diff --git a/de.vonloesch.pdf4eclipse/.settings/org.eclipse.jdt.core.prefs b/de.vonloesch.pdf4eclipse/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..3001c5e --- /dev/null +++ b/de.vonloesch.pdf4eclipse/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +#Wed Feb 08 13:06:11 PST 2012 +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.compliance=1.6 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.6 From 1c8a04d5490d43ae9fbdf706326ad007428359f6 Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Wed, 8 Feb 2012 15:42:37 -0800 Subject: [PATCH 04/20] Add tycho based p2 repo build --- .gitignore | 2 + de.vonloesch.pdf4eclipse.feature/.project | 12 ++ de.vonloesch.pdf4eclipse.feature/feature.xml | 188 +++++++++--------- de.vonloesch.pdf4eclipse.feature/pom.xml | 16 ++ de.vonloesch.pdf4eclipse.help/pom.xml | 16 ++ .../.project | 17 ++ .../category.xml | 11 + de.vonloesch.pdf4eclipse.p2repository/pom.xml | 17 ++ de.vonloesch.pdf4eclipse/.classpath | 4 +- de.vonloesch.pdf4eclipse/.project | 6 + .../org.eclipse.core.resources.prefs | 3 + .../.settings/org.eclipse.jdt.core.prefs | 3 +- .../.settings/org.eclipse.m2e.core.prefs | 5 + de.vonloesch.pdf4eclipse/META-INF/MANIFEST.MF | 2 +- de.vonloesch.pdf4eclipse/pom.xml | 16 ++ .../pdf4eclipse/editors/PDFEditor.java | 32 ++- pom.xml | 116 +++++++++++ 17 files changed, 366 insertions(+), 100 deletions(-) create mode 100644 .gitignore create mode 100644 de.vonloesch.pdf4eclipse.feature/.project create mode 100644 de.vonloesch.pdf4eclipse.feature/pom.xml create mode 100644 de.vonloesch.pdf4eclipse.help/pom.xml create mode 100644 de.vonloesch.pdf4eclipse.p2repository/.project create mode 100644 de.vonloesch.pdf4eclipse.p2repository/category.xml create mode 100644 de.vonloesch.pdf4eclipse.p2repository/pom.xml create mode 100644 de.vonloesch.pdf4eclipse/.settings/org.eclipse.core.resources.prefs create mode 100644 de.vonloesch.pdf4eclipse/.settings/org.eclipse.m2e.core.prefs create mode 100644 de.vonloesch.pdf4eclipse/pom.xml create mode 100644 pom.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..235d9f4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*/target/ + diff --git a/de.vonloesch.pdf4eclipse.feature/.project b/de.vonloesch.pdf4eclipse.feature/.project new file mode 100644 index 0000000..2c99087 --- /dev/null +++ b/de.vonloesch.pdf4eclipse.feature/.project @@ -0,0 +1,12 @@ + + + de.vonloesch.pdf4eclipse.feature + + + + + + + + + diff --git a/de.vonloesch.pdf4eclipse.feature/feature.xml b/de.vonloesch.pdf4eclipse.feature/feature.xml index 834d63e..7a0136a 100644 --- a/de.vonloesch.pdf4eclipse.feature/feature.xml +++ b/de.vonloesch.pdf4eclipse.feature/feature.xml @@ -1,8 +1,8 @@ @@ -10,101 +10,101 @@ - Copyright (c) 2011 Boris von Loesch. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Public License -v1.0 -which accompanies this distribution, and is available at + Copyright (c) 2011 Boris von Loesch. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License +v1.0 +which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html - Eclipse Public License -v 1.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and - -b) in the case of each subsequent Contributor: - -i) changes to the Program, and - -ii) additions to the Program; - -where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. - -"Program" means the Contributions distributed in accordance with this Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. - -2. GRANT OF RIGHTS - -a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. - -b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. - -c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. - -d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: - -a) it complies with the terms and conditions of this Agreement; and - -b) its license agreement: - -i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; - -ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; - -iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and - -iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. - -When the Program is made available in source code form: - -a) it must be made available under this Agreement; and - -b) a copy of this Agreement must be included with each copy of the Program. - -Contributors may not remove or alter any copyright notices contained within the Program. - -Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. - + Eclipse Public License -v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. @@ -125,7 +125,7 @@ This Agreement is governed by the laws of the State of New York and the intellec + + 4.0.0 + + parent + de.vonloesch.pdf4eclipse + 1.0.1-SNAPSHOT + ../pom.xml + + de.vonloesch.pdf4eclipse + de.vonloesch.pdf4eclipse.feature + 1.0.1-SNAPSHOT + eclipse-feature + diff --git a/de.vonloesch.pdf4eclipse.help/pom.xml b/de.vonloesch.pdf4eclipse.help/pom.xml new file mode 100644 index 0000000..5300dfb --- /dev/null +++ b/de.vonloesch.pdf4eclipse.help/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + + parent + de.vonloesch.pdf4eclipse + 1.0.0-SNAPSHOT + ../pom.xml + + + de.vonloesch.pdf4eclipse.help + eclipse-plugin + \ No newline at end of file diff --git a/de.vonloesch.pdf4eclipse.p2repository/.project b/de.vonloesch.pdf4eclipse.p2repository/.project new file mode 100644 index 0000000..eb6708b --- /dev/null +++ b/de.vonloesch.pdf4eclipse.p2repository/.project @@ -0,0 +1,17 @@ + + + de.vonloesch.pdf4eclipse.p2repository + + + + + + org.eclipse.pde.UpdateSiteBuilder + + + + + + org.eclipse.pde.UpdateSiteNature + + diff --git a/de.vonloesch.pdf4eclipse.p2repository/category.xml b/de.vonloesch.pdf4eclipse.p2repository/category.xml new file mode 100644 index 0000000..4a3c347 --- /dev/null +++ b/de.vonloesch.pdf4eclipse.p2repository/category.xml @@ -0,0 +1,11 @@ + + + + + + + + PDF4Eclipse Category + + + diff --git a/de.vonloesch.pdf4eclipse.p2repository/pom.xml b/de.vonloesch.pdf4eclipse.p2repository/pom.xml new file mode 100644 index 0000000..35bd435 --- /dev/null +++ b/de.vonloesch.pdf4eclipse.p2repository/pom.xml @@ -0,0 +1,17 @@ + + + 4.0.0 + + parent + de.vonloesch.pdf4eclipse + 1.0.1-SNAPSHOT + ../pom.xml + + de.vonloesch.pdf4eclipse + de.vonloesch.pdf4eclipse.p2repository + 1.0.0-SNAPSHOT + eclipse-repository + + diff --git a/de.vonloesch.pdf4eclipse/.classpath b/de.vonloesch.pdf4eclipse/.classpath index c09b3dc..1e35e0f 100644 --- a/de.vonloesch.pdf4eclipse/.classpath +++ b/de.vonloesch.pdf4eclipse/.classpath @@ -2,8 +2,8 @@ - + - + diff --git a/de.vonloesch.pdf4eclipse/.project b/de.vonloesch.pdf4eclipse/.project index 19a2c69..eb3fd9b 100644 --- a/de.vonloesch.pdf4eclipse/.project +++ b/de.vonloesch.pdf4eclipse/.project @@ -20,8 +20,14 @@ + + org.eclipse.m2e.core.maven2Builder + + + + org.eclipse.m2e.core.maven2Nature org.eclipse.pde.PluginNature org.eclipse.jdt.core.javanature diff --git a/de.vonloesch.pdf4eclipse/.settings/org.eclipse.core.resources.prefs b/de.vonloesch.pdf4eclipse/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..2a0c086 --- /dev/null +++ b/de.vonloesch.pdf4eclipse/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +#Wed Feb 08 15:02:29 PST 2012 +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/de.vonloesch.pdf4eclipse/.settings/org.eclipse.jdt.core.prefs b/de.vonloesch.pdf4eclipse/.settings/org.eclipse.jdt.core.prefs index 3001c5e..55a214c 100644 --- a/de.vonloesch.pdf4eclipse/.settings/org.eclipse.jdt.core.prefs +++ b/de.vonloesch.pdf4eclipse/.settings/org.eclipse.jdt.core.prefs @@ -1,8 +1,9 @@ -#Wed Feb 08 13:06:11 PST 2012 +#Wed Feb 08 15:02:29 PST 2012 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.compliance=1.6 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning org.eclipse.jdt.core.compiler.source=1.6 diff --git a/de.vonloesch.pdf4eclipse/.settings/org.eclipse.m2e.core.prefs b/de.vonloesch.pdf4eclipse/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..ec12694 --- /dev/null +++ b/de.vonloesch.pdf4eclipse/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,5 @@ +#Wed Feb 08 14:49:27 PST 2012 +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/de.vonloesch.pdf4eclipse/META-INF/MANIFEST.MF b/de.vonloesch.pdf4eclipse/META-INF/MANIFEST.MF index d39d42e..b45075d 100644 --- a/de.vonloesch.pdf4eclipse/META-INF/MANIFEST.MF +++ b/de.vonloesch.pdf4eclipse/META-INF/MANIFEST.MF @@ -1,7 +1,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name -Bundle-SymbolicName: de.vonloesch.pdf4Eclipse;singleton:=true +Bundle-SymbolicName: de.vonloesch.pdf4eclipse;singleton:=true Bundle-Version: 1.0.1.qualifier Bundle-Activator: de.vonloesch.pdf4eclipse.Activator Require-Bundle: org.eclipse.ui;bundle-version="3.1.0", diff --git a/de.vonloesch.pdf4eclipse/pom.xml b/de.vonloesch.pdf4eclipse/pom.xml new file mode 100644 index 0000000..6df3faa --- /dev/null +++ b/de.vonloesch.pdf4eclipse/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + + parent + de.vonloesch.pdf4eclipse + 1.0.1-SNAPSHOT + ../pom.xml + + + de.vonloesch.pdf4eclipse + eclipse-plugin + \ No newline at end of file diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java index c681898..b3ee55f 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java @@ -44,6 +44,8 @@ import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.layout.FillLayout; +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.swt.widgets.ScrollBar; @@ -247,8 +249,34 @@ public void run() { @Override public void createPartControl(final Composite parent) { - parent.setLayout(new FillLayout()); - sc = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL); + Composite composite= new Composite(parent, SWT.NONE); + GridLayout layout= new GridLayout(1, false); + layout.marginHeight= 0; + layout.marginWidth= 0; + layout.horizontalSpacing= 0; + layout.verticalSpacing= 0; + composite.setLayout(layout); + + // a composite used to show controls + Composite menuC = new Composite(composite, SWT.NONE); + GridData layoutData= new GridData(SWT.FILL, SWT.TOP, true, false); + menuC.setLayoutData(layoutData); + layout = new GridLayout(1, false); + layout.marginHeight= 0; + layout.marginWidth= 0; + layout.horizontalSpacing= 0; + layout.verticalSpacing= 0; + layoutData.exclude= true; + menuC.setLayout(layout); + + sc = new ScrolledComposite(composite, SWT.H_SCROLL | SWT.V_SCROLL); + sc.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + FillLayout fillLayout= new FillLayout(SWT.VERTICAL); + fillLayout.marginHeight= 0; + fillLayout.marginWidth= 0; + fillLayout.spacing= 0; + sc.setLayout(fillLayout); + pv = new PDFPageViewer(sc, this); //pv = new PDFPageViewerAWT(sc, this); sc.setContent(pv); diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f34c062 --- /dev/null +++ b/pom.xml @@ -0,0 +1,116 @@ + + 4.0.0 + de.vonloesch.pdf4eclipse + parent + 1.0.1-SNAPSHOT + pom + + + de.vonloesch.pdf4eclipse.help + de.vonloesch.pdf4eclipse + de.vonloesch.pdf4eclipse.feature + + de.vonloesch.pdf4eclipse.p2repository + + + + + 3.0 + + + + + + UTF-8 + + 0.14.0-SNAPSHOT + + + + + + indigo + p2 + http://download.eclipse.org/releases/indigo + + + + + + + + org.eclipse.tycho + tycho-maven-plugin + ${tycho-version} + true + + + org.eclipse.tycho + tycho-compiler-plugin + ${tycho-version} + + 1.6 + 1.5 + UTF-8 + + + + org.eclipse.tycho + tycho-packaging-plugin + ${tycho-version} + + + false + + + + + org.eclipse.tycho + target-platform-configuration + ${tycho-version} + + + + + + + linux + gtk + x86 + + + linux + gtk + x86_64 + + + + + win32 + win32 + x86 + + + win32 + win32 + x86_64 + + + + + macosx + cocoa + x86 + + + macosx + cocoa + x86_64 + + + + + + + + From f0cd4e3185250e2e20e830ecdca19d15d7c3dfc4 Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Wed, 8 Feb 2012 15:44:41 -0800 Subject: [PATCH 05/20] Ignore bin/ folders --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 235d9f4..7096d28 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ */target/ +*/bin From 0b54e66fe8d85f65492537fca91da7b5bd37f97a Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Wed, 8 Feb 2012 16:57:13 -0800 Subject: [PATCH 06/20] Fix incorrect version number breaking the build --- de.vonloesch.pdf4eclipse.help/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/de.vonloesch.pdf4eclipse.help/pom.xml b/de.vonloesch.pdf4eclipse.help/pom.xml index 5300dfb..cd32ac1 100644 --- a/de.vonloesch.pdf4eclipse.help/pom.xml +++ b/de.vonloesch.pdf4eclipse.help/pom.xml @@ -7,7 +7,7 @@ parent de.vonloesch.pdf4eclipse - 1.0.0-SNAPSHOT + 1.0.1-SNAPSHOT ../pom.xml From 8e39016396c493167c382bdbf31a1cfdf00d556b Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Wed, 8 Feb 2012 17:21:24 -0800 Subject: [PATCH 07/20] Align pom.xml version with Manifest --- de.vonloesch.pdf4eclipse.help/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/de.vonloesch.pdf4eclipse.help/pom.xml b/de.vonloesch.pdf4eclipse.help/pom.xml index cd32ac1..584d390 100644 --- a/de.vonloesch.pdf4eclipse.help/pom.xml +++ b/de.vonloesch.pdf4eclipse.help/pom.xml @@ -13,4 +13,5 @@ de.vonloesch.pdf4eclipse.help eclipse-plugin + 1.0.0-SNAPSHOT \ No newline at end of file From 1531252a3d1cf447d4e129e07d7fd8fc245a044e Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Thu, 9 Feb 2012 12:33:21 -0800 Subject: [PATCH 08/20] Increase compiler target version to 1.6. to make Maven compiler plugin happy which otherwise _silently_ skips the classes --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f34c062..855fb90 100644 --- a/pom.xml +++ b/pom.xml @@ -50,7 +50,7 @@ ${tycho-version} 1.6 - 1.5 + 1.6 UTF-8 From 9c96180f531bcb973b869328ba07aa93f7376404 Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Thu, 16 Feb 2012 12:46:31 -0800 Subject: [PATCH 09/20] Remove help bundle. It is tailored for Texclipse only. --- de.vonloesch.pdf4eclipse.feature/feature.xml | 188 +++++++++---------- 1 file changed, 91 insertions(+), 97 deletions(-) diff --git a/de.vonloesch.pdf4eclipse.feature/feature.xml b/de.vonloesch.pdf4eclipse.feature/feature.xml index 7a0136a..a54f901 100644 --- a/de.vonloesch.pdf4eclipse.feature/feature.xml +++ b/de.vonloesch.pdf4eclipse.feature/feature.xml @@ -10,101 +10,101 @@ - Copyright (c) 2011 Boris von Loesch. -All rights reserved. This program and the accompanying materials -are made available under the terms of the Eclipse Public License -v1.0 -which accompanies this distribution, and is available at + Copyright (c) 2011 Boris von Loesch. +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License +v1.0 +which accompanies this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html - Eclipse Public License -v 1.0 - -THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. - -1. DEFINITIONS - -"Contribution" means: - -a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and - -b) in the case of each subsequent Contributor: - -i) changes to the Program, and - -ii) additions to the Program; - -where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. - -"Contributor" means any person or entity that distributes the Program. - -"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. - -"Program" means the Contributions distributed in accordance with this Agreement. - -"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. - -2. GRANT OF RIGHTS - -a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. - -b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. - -c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. - -d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. - -3. REQUIREMENTS - -A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: - -a) it complies with the terms and conditions of this Agreement; and - -b) its license agreement: - -i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; - -ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; - -iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and - -iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. - -When the Program is made available in source code form: - -a) it must be made available under this Agreement; and - -b) a copy of this Agreement must be included with each copy of the Program. - -Contributors may not remove or alter any copyright notices contained within the Program. - -Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. - -4. COMMERCIAL DISTRIBUTION - -Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. - -For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. - -5. NO WARRANTY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. - -6. DISCLAIMER OF LIABILITY - -EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -7. GENERAL - -If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. - -If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. - -All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. - -Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. - + Eclipse Public License -v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. @@ -131,10 +131,4 @@ This Agreement is governed by the laws of the State of New York and the intellec version="0.0.0" unpack="false"/> - - From b7b3bf12b2b51af05d36e6e897745e56975ba018 Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Thu, 16 Feb 2012 13:08:36 -0800 Subject: [PATCH 10/20] Update to tycho 0.14.0 release --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 855fb90..5b49f3c 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ UTF-8 - 0.14.0-SNAPSHOT + 0.14.0 From 7126689b3e3df4a39321a54639320f283b260273 Mon Sep 17 00:00:00 2001 From: Robert Bamler Date: Thu, 10 May 2012 22:58:39 +0200 Subject: [PATCH 11/20] Proof-of-concept for auto-trimming of page margins This implementation follows the second approach outlined in #issuecomment-5596872 (see issue #20 on github.com/Borisvl/ Pdf4Eclipse). Auto-trimming can be turned on and of with the boolean field PDFPageView.autoTrimOn, which, for now, is just a static constant. Things that remain to do: - I'm not sure if this implementation is memory efficient. Maybe we could do with copying the image one less time. - Coordinate transformation for forward/backward search and for annotations. - Correct handling of the "fit page to screen" and "fit page width to screen width" zoom actions. - Frontend to turn auto-trimming on and off (toggle button). --- .../vonloesch/pdf4eclipse/PDFPageViewer.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java index f6b5c18..a192fda 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java @@ -16,6 +16,7 @@ import java.awt.geom.Rectangle2D.Double; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; +import java.awt.image.DataBufferInt; import java.awt.image.DirectColorModel; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; @@ -53,6 +54,8 @@ * */ public class PDFPageViewer extends Canvas implements PaintListener, IPreferenceChangeListener{ + private static final boolean autoTrimOn = true; + /** The image of the rendered PDF page being displayed */ private Image currentImage; @@ -306,6 +309,9 @@ public void showPage(IPDFPage page) { if (sz.x == 0 || sz.y == 0) return; currentImage = page.getImage(newH, newW); + if (autoTrimOn) { + trimCurrentImage(); + } newW = currentImage.getWidth(null); newH = currentImage.getHeight(null); @@ -329,6 +335,78 @@ public void showPage(IPDFPage page) { } } + private void trimCurrentImage() { + if (currentImage==null) + return; + + int origw = currentImage.getWidth(null); + int origh = currentImage.getHeight(null); + if (origw<1 || origh<1) + return; + + BufferedImage img = new BufferedImage(origw, origh, BufferedImage.TYPE_INT_ARGB); + img.getGraphics().drawImage(currentImage, 0, 0, origw, origh, 0, 0, origw, origh, null); + + int[] srcbuf = ((DataBufferInt) img.getRaster().getDataBuffer()).getData(); + + // detect upper margin + int trimy1 = origh; + int referenceColor = srcbuf[0]; + for (int i=0; i!=srcbuf.length; i++) { + if (srcbuf[i] != referenceColor) { + trimy1 = i/origw; + break; + } + } + + // detect lower margin + int trimy2 = 0; + referenceColor = srcbuf[srcbuf.length-1]; + for (int i=srcbuf.length-1; i!=trimy1*origw-1; i--) { + if (srcbuf[i] != referenceColor) { + trimy2 = i/origw + 1; + break; + } + } + + // detect left margin + int trimx1 = 0; + referenceColor = srcbuf[0]; + int offset = trimy1*origw; + int end = trimy2*origw; + trimx1loop: + while (trimx1 != origw) { + for (int i=offset+trimx1; i Date: Sun, 13 May 2012 19:05:49 +0200 Subject: [PATCH 12/20] Automatically trim page margins (issue #20) Finish implementation of auto-trimming of page margins. Detailed list of changes compared to previous commit: - Add front end (toolbar button). - Fix coordinate transformations for annotations and for synctex forward/backward search. - Fix behaviour of the "fit page to screen" and "fit page width to screen width" commands when auto-trimming is activated. --- .../OSGI-INF/l10n/bundle.properties | 2 + de.vonloesch.pdf4eclipse/icons/autotrim.png | Bin 0 -> 585 bytes de.vonloesch.pdf4eclipse/plugin.xml | 33 +++++++++ .../vonloesch/pdf4eclipse/PDFPageViewer.java | 42 +++++++++-- .../pdf4eclipse/editors/PDFEditor.java | 7 +- .../handlers/ToggleAutoTrimHandler.java | 65 ++++++++++++++++++ 6 files changed, 142 insertions(+), 7 deletions(-) create mode 100644 de.vonloesch.pdf4eclipse/icons/autotrim.png create mode 100644 de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/handlers/ToggleAutoTrimHandler.java diff --git a/de.vonloesch.pdf4eclipse/OSGI-INF/l10n/bundle.properties b/de.vonloesch.pdf4eclipse/OSGI-INF/l10n/bundle.properties index 9f7b588..5019032 100644 --- a/de.vonloesch.pdf4eclipse/OSGI-INF/l10n/bundle.properties +++ b/de.vonloesch.pdf4eclipse/OSGI-INF/l10n/bundle.properties @@ -8,9 +8,11 @@ command.description.0 = Set the zoom level command.name.0 = Zoom commandParameter.name = zoomlevel command.name.1 = Toggle highlight +command.name.2 = Toggle auto-trimming command.tooltip = Zoom out command.tooltip.0 = Fit page to window command.tooltip.1 = Fit page to window width command.tooltip.2 = Zoom in command.tooltip.3 = Toggle link highlighting +command.tooltip.4 = Trim Page Margins context.name = PDF viewer \ No newline at end of file diff --git a/de.vonloesch.pdf4eclipse/icons/autotrim.png b/de.vonloesch.pdf4eclipse/icons/autotrim.png new file mode 100644 index 0000000000000000000000000000000000000000..720a56fd6c20c72eb4174567037b5733dd4742e4 GIT binary patch literal 585 zcmV-P0=E5$P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iye> z5CsJFp0afS00GHKL_t(I%cYY)XcJK!$3K@`APz^HOCTv3{6mE^It4S8f(UX&f?Yc0 zz?%do!9|j(xhX-=#UO&EH`&SEyH0{}5(g)R6avynmY$rwGah1}gGoJW(+Gay@%a7T z@B96IAMf`NLJ(gqRb4-tJLxPz4DD=o9cVHg&2h~k68tCRSm%Gnq`tnlXUXH>E-*JK z*l}HP(ly4r-_B-{s?{pRViD6c$>;MN^m<}Z*N0iX!AN49R3vY}>~7{h0zm5b*X<2jf*2ZFiSM7>4xw15EQ4 zilWRE$mMcezNWLdyiBFv2SrgRl`gTd@r-Ww9X-bp)6jDq(dj&8G#a6wJ;(J_>X&LV znM9UlWLcgmF#6P>P$-a2rvZ>!s`}UTt!-@`YyWwz77zD<2Xe#ntd^?&@y_R0R-}t( zVC@PlU6uG6g1%Y@5bUP4Noeah64eo79{l5I-5`0eCcEa(0qBpx7^o1 zevk4|EU55#AENIPckX@Q@qLXT5Yzuc+)_(bx&3gG5xoDXF*gtMneiCk^eo;a4>>;p XNX+ + + + + + + + + + + @@ -190,6 +211,18 @@ + + + + + + diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java index a192fda..b2d72ce 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java @@ -7,6 +7,7 @@ * * Contributors: * Boris von Loesch - initial API and implementation + * Robert Bamler - auto-trimming of page margins ******************************************************************************/ package de.vonloesch.pdf4eclipse; @@ -40,6 +41,7 @@ import org.eclipse.swt.widgets.Display; import de.vonloesch.pdf4eclipse.editors.PDFEditor; +import de.vonloesch.pdf4eclipse.editors.handlers.ToggleAutoTrimHandler; import de.vonloesch.pdf4eclipse.editors.handlers.ToggleLinkHighlightHandler; import de.vonloesch.pdf4eclipse.model.IPDFLinkAnnotation; import de.vonloesch.pdf4eclipse.model.IPDFPage; @@ -54,8 +56,6 @@ * */ public class PDFPageViewer extends Canvas implements PaintListener, IPreferenceChangeListener{ - private static final boolean autoTrimOn = true; - /** The image of the rendered PDF page being displayed */ private Image currentImage; @@ -75,6 +75,11 @@ public class PDFPageViewer extends Canvas implements PaintListener, IPreferenceC private float zoomFactor; + private boolean autoTrimOn = true; + private Point trimOffset = new Point(0, 0); + private float horizontalTrimFactor = 1.0f; + private float verticalTrimFactor = 1.0f; + //private org.eclipse.swt.graphics.Image swtImage; /** @@ -181,6 +186,7 @@ public void run() { prefs.addPreferenceChangeListener(this); highlightLinks = prefs.getBoolean(ToggleLinkHighlightHandler.PREF_LINKHIGHTLIGHT_ID, true); + autoTrimOn = prefs.getBoolean(ToggleAutoTrimHandler.PREF_AUTOTRIM_ID, false); } @@ -403,6 +409,12 @@ private void trimCurrentImage() { trimy1 = Math.max(0, trimy1-margin); trimy2 = Math.min(origh, trimy2+margin); + // remember trim margins + trimOffset .x = trimx1; + trimOffset.y = trimy1; + horizontalTrimFactor = 1.0f * (trimx2-trimx1) / origw; + verticalTrimFactor = 1.0f * (trimy2-trimy1) / origh; + // crop image currentImage = img.getSubimage(trimx1, trimy1, trimx2-trimx1, trimy2-trimy1); } @@ -412,11 +424,14 @@ private Rectangle getRectangle(Rectangle2D r) { } public Rectangle2D convertPDF2ImageCoord(Rectangle2D r) { - return currentPage.pdf2ImageCoordinates(r); + Rectangle2D coord = currentPage.pdf2ImageCoordinates(r); + coord.setRect(coord.getX()-trimOffset.x, coord.getY()-trimOffset.y, coord.getWidth(), coord.getHeight()); + return coord; } public Rectangle2D convertImage2PDFCoord(Rectangle2D r) { - return currentPage.image2PdfCoordinates(r); + java.awt.Rectangle coord = new java.awt.Rectangle((int)r.getX()+trimOffset.x, (int)r.getY()+trimOffset.y, (int)r.getWidth(), (int)r.getHeight()); + return currentPage.image2PdfCoordinates(coord); } /** @@ -501,6 +516,15 @@ public void preferenceChange(PreferenceChangeEvent event) { if (ToggleLinkHighlightHandler.PREF_LINKHIGHTLIGHT_ID.equals(event.getKey())) { highlightLinks = Boolean.parseBoolean((String)(event.getNewValue())); redraw(); + } else if (ToggleAutoTrimHandler.PREF_AUTOTRIM_ID.equals(event.getKey())) { + autoTrimOn = Boolean.parseBoolean((String)(event.getNewValue())); + if (!autoTrimOn) { + trimOffset.x = 0; + trimOffset.y = 0; + horizontalTrimFactor = 1.0f; + verticalTrimFactor = 1.0f; + } + showPage(currentPage); } } @@ -523,4 +547,14 @@ public void dispose() { IEclipsePreferences prefs = (new InstanceScope()).getNode(de.vonloesch.pdf4eclipse.Activator.PLUGIN_ID); prefs.removePreferenceChangeListener(this); } + + + public float getHorizontalTrimFactor() { + return horizontalTrimFactor; + } + + + public float getVerticalTrimFactor() { + return verticalTrimFactor; + } } \ No newline at end of file diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java index 12e3459..b0dc1bc 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java @@ -8,6 +8,7 @@ * Contributors: * Boris von Loesch - initial API and implementation * MeisterYeti - pseudo-continuous scrolling and zooming by mouse wheel + * Robert Bamler - auto-trimming of page margins ******************************************************************************/ package de.vonloesch.pdf4eclipse.editors; @@ -742,12 +743,12 @@ private void updateStatusLine() { public void fitHorizontal() { int w = sc.getClientArea().width; - pv.setZoomFactor((1.0f*w)/pv.getPage().getWidth()); + pv.setZoomFactor((1.0f/pv.getHorizontalTrimFactor()*w)/pv.getPage().getWidth()); } public void fit() { - float w = 1.f * sc.getClientArea().width; - float h = 1.f * sc.getClientArea().height; + float w = 1.f/pv.getHorizontalTrimFactor() * sc.getClientArea().width; + float h = 1.f/pv.getVerticalTrimFactor() * sc.getClientArea().height; float pw = pv.getPage().getWidth(); float ph = pv.getPage().getHeight(); if (w/pw < h/ph) pv.setZoomFactor(w/pw); diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/handlers/ToggleAutoTrimHandler.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/handlers/ToggleAutoTrimHandler.java new file mode 100644 index 0000000..cb91746 --- /dev/null +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/handlers/ToggleAutoTrimHandler.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2011 Boris von Loesch. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boris von Loesch - initial API and implementation + * Robert Bamler - auto-trimming of page margins + ******************************************************************************/ +package de.vonloesch.pdf4eclipse.editors.handlers; + +import java.util.Map; + +import org.eclipse.core.commands.AbstractHandler; +import org.eclipse.core.commands.Command; +import org.eclipse.core.commands.ExecutionEvent; +import org.eclipse.core.commands.ExecutionException; +import org.eclipse.core.commands.State; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.InstanceScope; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.commands.ICommandService; +import org.eclipse.ui.commands.IElementUpdater; +import org.eclipse.ui.handlers.RegistryToggleState; +import org.eclipse.ui.menus.UIElement; +import org.osgi.service.prefs.BackingStoreException; + +public class ToggleAutoTrimHandler extends AbstractHandler implements IElementUpdater{ + + public final static String PREF_AUTOTRIM_ID = "de.vonloesch.pdf4eclipse.preferences.autoTrim"; + + private final static String COMMAND_ID = "PDFViewer.command.ToggleAutoTrim"; + private final static String STATE_ID = RegistryToggleState.STATE_ID; + + @Override + public Object execute(ExecutionEvent event) throws ExecutionException { + Command command = event.getCommand(); + State state = command.getState(STATE_ID); + state.setValue(!(Boolean) state.getValue()); + + ICommandService service = + (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class); + service.refreshElements(command.getId(), null); + IEclipsePreferences prefs = (new InstanceScope()).getNode(de.vonloesch.pdf4eclipse.Activator.PLUGIN_ID); + prefs.putBoolean(PREF_AUTOTRIM_ID, ((Boolean) state.getValue()).booleanValue()); + try { + prefs.flush(); + } catch (BackingStoreException e) { + //Do nothing + } + return null; + } + + @Override + public void updateElement(UIElement element, Map parameters) { + ICommandService service = + (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class); + Command command = service.getCommand(COMMAND_ID); + State state = command.getState(STATE_ID); + element.setChecked(((Boolean) state.getValue()).booleanValue()); + } + +} From 52128f4393b55a219ac701ff042cbc80f8070011 Mon Sep 17 00:00:00 2001 From: Robert Bamler Date: Sun, 13 May 2012 19:17:11 +0200 Subject: [PATCH 13/20] Fix rounding of scaled page size With the previous implementation, fitting the page width to the screen width sometimes resulted in a page width that was actually one pixel *larger* than the screen width. This was due the use of Math.round(). This commit should fix this issue by always rounding _down_ the would-be floating point page dimensions to the integer page dimensions. --- .../src/de/vonloesch/pdf4eclipse/PDFPageViewer.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java index b2d72ce..263bbac 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java @@ -308,8 +308,9 @@ public void showPage(IPDFPage page) { highlight = null; boolean resize = false; - int newW = Math.round(zoomFactor*page.getWidth()); - int newH = Math.round(zoomFactor*page.getHeight()); + // always round _down_ so that the fit-to-screen commands work properly + int newW = (int) (zoomFactor*page.getWidth()); + int newH = (int) (zoomFactor*page.getHeight()); Point sz = getSize(); From 9c2ec9591d2613d90f7b762c491787b447925267 Mon Sep 17 00:00:00 2001 From: Francesco Kriegel Date: Wed, 19 Feb 2014 20:10:46 +0100 Subject: [PATCH 14/20] autoresize. --- de.vonloesch.pdf4eclipse/lib/jbig2.jar | Bin 0 -> 86867 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 de.vonloesch.pdf4eclipse/lib/jbig2.jar diff --git a/de.vonloesch.pdf4eclipse/lib/jbig2.jar b/de.vonloesch.pdf4eclipse/lib/jbig2.jar new file mode 100644 index 0000000000000000000000000000000000000000..23ef424e31715c6b6822a2e20d2f32353a979465 GIT binary patch literal 86867 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�Q!dk8@JAeG{E#yJjD6ogqT`1&p!Yi&+k)VW)PmE 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 literal 0 HcmV?d00001 From ad4106362bbcff5698e0da95c812c8ffc40c6951 Mon Sep 17 00:00:00 2001 From: Francesco Kriegel Date: Wed, 19 Feb 2014 20:14:05 +0100 Subject: [PATCH 15/20] autoresize. --- .../vonloesch/pdf4eclipse/editors/PDFEditor.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java index 12e3459..1e4761a 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java @@ -44,6 +44,8 @@ import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ScrolledComposite; +import org.eclipse.swt.events.ControlEvent; +import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.events.FocusEvent; import org.eclipse.swt.events.FocusListener; import org.eclipse.swt.events.KeyAdapter; @@ -471,6 +473,19 @@ else if (e.keyCode == SWT.END) { } initKeyBindingContext(); + sc.addControlListener(new ControlListener() { + + @Override + public void controlResized(ControlEvent e) { + try { + fitHorizontal(); + } catch (Exception ex) {} + } + + @Override + public void controlMoved(ControlEvent e) { + } + }); } @Override From ceee77d100aba4f757058cb1840df9a4d1f0f844 Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Fri, 8 Apr 2016 10:33:15 +0200 Subject: [PATCH 16/20] Bump Tycho version to 0.24 and build against Mars release of Eclipse rather Indigo. --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 5b49f3c..c8b72fb 100644 --- a/pom.xml +++ b/pom.xml @@ -23,15 +23,15 @@ UTF-8 - 0.14.0 + 0.24.0 - indigo + mars p2 - http://download.eclipse.org/releases/indigo + http://download.eclipse.org/eclipse/updates/4.5/R-4.5.2-201602121500/ From 57a77962a61c739750e4fb320139360b31c3b658 Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Fri, 8 Apr 2016 10:52:22 +0200 Subject: [PATCH 17/20] Trim PDFs by default which means that the top/bottom/left/right margins are cut off. They are only useful when printed on paper, but not on a computer screen. --- .../pdf4eclipse/preferences/PreferenceInitializer.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/preferences/PreferenceInitializer.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/preferences/PreferenceInitializer.java index 391c452..7656082 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/preferences/PreferenceInitializer.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/preferences/PreferenceInitializer.java @@ -15,6 +15,7 @@ import org.eclipse.jface.preference.IPreferenceStore; import de.vonloesch.pdf4eclipse.Activator; +import de.vonloesch.pdf4eclipse.editors.handlers.ToggleAutoTrimHandler; import de.vonloesch.pdf4eclipse.model.PDFFactory; /** @@ -31,6 +32,7 @@ public void initializeDefaultPreferences() { IPreferenceStore store = Activator.getDefault().getPreferenceStore(); store.setDefault(PreferenceConstants.PSEUDO_CONTINUOUS_SCROLLING, true); store.setDefault(PreferenceConstants.PDF_RENDERER, PDFFactory.STRATEGY_SUN_JPEDAL); + store.setDefault(ToggleAutoTrimHandler.PREF_AUTOTRIM_ID, true); } } From f9c4ccd7140cf3e41f7db6bb57dd311e416615c7 Mon Sep 17 00:00:00 2001 From: Markus Alexander Kuppe Date: Fri, 8 Apr 2016 21:43:48 +0200 Subject: [PATCH 18/20] Turn on autotrim by default --- .../src/de/vonloesch/pdf4eclipse/PDFPageViewer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java index 263bbac..a24bb27 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/PDFPageViewer.java @@ -186,7 +186,7 @@ public void run() { prefs.addPreferenceChangeListener(this); highlightLinks = prefs.getBoolean(ToggleLinkHighlightHandler.PREF_LINKHIGHTLIGHT_ID, true); - autoTrimOn = prefs.getBoolean(ToggleAutoTrimHandler.PREF_AUTOTRIM_ID, false); + autoTrimOn = prefs.getBoolean(ToggleAutoTrimHandler.PREF_AUTOTRIM_ID, true); } From 5103e5e2a802fe92ae05e0ff63dc6c7acf61c908 Mon Sep 17 00:00:00 2001 From: Francesco Kriegel Date: Wed, 22 Feb 2017 23:01:28 +0100 Subject: [PATCH 19/20] Extended automatic resize capability --- de.vonloesch.pdf4eclipse/plugin.xml | 4 +- .../pdf4eclipse/editors/PDFEditor.java | 37 ++++++++++++++++++- .../editors/handlers/ZoomHandler.java | 4 +- 3 files changed, 40 insertions(+), 5 deletions(-) diff --git a/de.vonloesch.pdf4eclipse/plugin.xml b/de.vonloesch.pdf4eclipse/plugin.xml index fad2752..9eb6212 100644 --- a/de.vonloesch.pdf4eclipse/plugin.xml +++ b/de.vonloesch.pdf4eclipse/plugin.xml @@ -133,7 +133,7 @@ @@ -149,7 +149,7 @@ diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java index 1e4761a..2e0c0d1 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/PDFEditor.java @@ -478,7 +478,16 @@ else if (e.keyCode == SWT.END) { @Override public void controlResized(ControlEvent e) { try { - fitHorizontal(); + switch (fitState) { + case FIT: + fit(); + break; + case FITH: + fitHorizontal(); + break; + case NONE: + break; + } } catch (Exception ex) {} } @@ -754,6 +763,32 @@ public INavigationLocation createNavigationLocation() { private void updateStatusLine() { position.setPageInfo(currentPage, f.getNumPages()); } + + private enum FIT_STATE { + NONE, + FIT, + FITH; + } + + private FIT_STATE fitState = FIT_STATE.FITH; + + public void _fitHorizontal() { + if (fitState == FIT_STATE.FITH) + fitState = FIT_STATE.NONE; + else { + fitState = FIT_STATE.FITH; + fitHorizontal(); + } + } + + public void _fit() { + if (fitState == FIT_STATE.FIT) + fitState = FIT_STATE.NONE; + else { + fitState = FIT_STATE.FIT; + fit(); + } + } public void fitHorizontal() { int w = sc.getClientArea().width; diff --git a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/handlers/ZoomHandler.java b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/handlers/ZoomHandler.java index 35f940f..9a4a58a 100644 --- a/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/handlers/ZoomHandler.java +++ b/de.vonloesch.pdf4eclipse/src/de/vonloesch/pdf4eclipse/editors/handlers/ZoomHandler.java @@ -56,11 +56,11 @@ else if (msg.charAt(0) == '=') { } else if (msg.toLowerCase().equals(FIT_HORIZONTAL)) { - ((PDFEditor) editor).fitHorizontal(); + ((PDFEditor) editor)._fitHorizontal(); return null; } else if (msg.toLowerCase().equals(FIT_COMPLETE)) { - ((PDFEditor) editor).fit(); + ((PDFEditor) editor)._fit(); return null; } From 5114fc4d46a024380f9b81cdb4b331837a27a87a Mon Sep 17 00:00:00 2001 From: Francesco Kriegel Date: Tue, 21 Mar 2017 18:19:53 +0100 Subject: [PATCH 20/20] Merge with latest version of lemmy/master --- .gitignore | 2 +- de.vonloesch.pdf4eclipse/.gitignore | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 de.vonloesch.pdf4eclipse/.gitignore diff --git a/.gitignore b/.gitignore index 7096d28..8c907c5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ */target/ */bin - +.DS_Store diff --git a/de.vonloesch.pdf4eclipse/.gitignore b/de.vonloesch.pdf4eclipse/.gitignore new file mode 100644 index 0000000..5e56e04 --- /dev/null +++ b/de.vonloesch.pdf4eclipse/.gitignore @@ -0,0 +1 @@ +/bin