From 05ff4be18f41b148aa80d63b053bd7eed1991eed Mon Sep 17 00:00:00 2001 From: Jeff Schiller Date: Thu, 30 Jul 2009 22:45:59 +0000 Subject: [PATCH] Fix Issue 33: Gradient picker for fill/stroke. Also start to optimize suspendRedraw/unsuspend. Added vector image of logo. git-svn-id: http://svg-edit.googlecode.com/svn/trunk@346 eee81c28-f429-11dd-99c0-75d572ba1ddd --- editor/images/logo.svg | 66 +++ editor/jgraduate/LICENSE | 202 ++++++++ editor/jgraduate/README | 3 + editor/jgraduate/css/jGraduate-0.2.0.css | 171 +++++++ editor/jgraduate/css/jPicker-1.0.9.css | 227 +++++++++ editor/jgraduate/images/Bars.png | Bin 0 -> 424 bytes editor/jgraduate/images/Maps.png | Bin 0 -> 84344 bytes editor/jgraduate/images/bar-opacity.png | Bin 0 -> 134 bytes editor/jgraduate/images/map-opacity.png | Bin 0 -> 139 bytes editor/jgraduate/images/mappoint.gif | Bin 0 -> 93 bytes editor/jgraduate/images/picker.gif | Bin 0 -> 146 bytes editor/jgraduate/images/preview-opacity.png | Bin 0 -> 135 bytes editor/jgraduate/images/rangearrows.gif | Bin 0 -> 94 bytes editor/jgraduate/images/rangearrows2.gif | Bin 0 -> 93 bytes editor/jgraduate/jpicker-1.0.9.min.js | 1 + editor/jgraduate/jquery.jgraduate.js | 529 ++++++++++++++++++++ editor/svg-editor.css | 13 +- editor/svg-editor.html | 11 +- editor/svg-editor.js | 149 +++--- editor/svgcanvas.js | 172 ++++++- 20 files changed, 1452 insertions(+), 92 deletions(-) create mode 100644 editor/images/logo.svg create mode 100644 editor/jgraduate/LICENSE create mode 100644 editor/jgraduate/README create mode 100644 editor/jgraduate/css/jGraduate-0.2.0.css create mode 100755 editor/jgraduate/css/jPicker-1.0.9.css create mode 100644 editor/jgraduate/images/Bars.png create mode 100644 editor/jgraduate/images/Maps.png create mode 100644 editor/jgraduate/images/bar-opacity.png create mode 100644 editor/jgraduate/images/map-opacity.png create mode 100644 editor/jgraduate/images/mappoint.gif create mode 100644 editor/jgraduate/images/picker.gif create mode 100644 editor/jgraduate/images/preview-opacity.png create mode 100644 editor/jgraduate/images/rangearrows.gif create mode 100644 editor/jgraduate/images/rangearrows2.gif create mode 100755 editor/jgraduate/jpicker-1.0.9.min.js create mode 100644 editor/jgraduate/jquery.jgraduate.js diff --git a/editor/images/logo.svg b/editor/images/logo.svg new file mode 100644 index 00000000..038d0a93 --- /dev/null +++ b/editor/images/logo.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/editor/jgraduate/LICENSE b/editor/jgraduate/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/editor/jgraduate/LICENSE @@ -0,0 +1,202 @@ + + 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. diff --git a/editor/jgraduate/README b/editor/jgraduate/README new file mode 100644 index 00000000..ef3e21ff --- /dev/null +++ b/editor/jgraduate/README @@ -0,0 +1,3 @@ +jGraduate - A jQuery plugin for picking gradients + +Licensed under the Apache License 2. See LICENSE for more information. diff --git a/editor/jgraduate/css/jGraduate-0.2.0.css b/editor/jgraduate/css/jGraduate-0.2.0.css new file mode 100644 index 00000000..ffa0e9aa --- /dev/null +++ b/editor/jgraduate/css/jGraduate-0.2.0.css @@ -0,0 +1,171 @@ +/* + * jGraduate Default CSS + * + * Copyright (c) 2009 Jeff Schiller + * + * Licensed under the Apache License Version 2 + */ + +h2.jGraduate_Title { + font-family: Arial, Helvetica, Sans-Serif; + font-size: 11px !important; + font-weight: bold; + margin: -13px 0px 0px 0px; + padding: 0px; + text-align: center; +} + +.jGraduate_Picker { + font-family: Arial, Helvetica, Sans-Serif; + font-size: 12px; + border-style: solid; + border-color: lightgrey black black lightgrey; + border-width: 1px; + background-color: #EFEFEF; + position: absolute; + padding: 10px; +} + +li.jGraduate_tab_color, li.jGraduate_tab_lingrad { + background-color: #ccc; + display: inline; + border: solid 1px grey; + padding: 3px; + margin: 2px; + cursor: pointer; +} + +li.jGraduate_tab_current { + background-color: #EFEFEF; + display: inline; + padding: 3px; + margin: 2px; + border: solid 1px black; + cursor: pointer; +} + +.jGraduate_colPick { + display: none; +} + +.jGraduate_lgPick { + display: none; + border: outset 1px #666; + padding: 10px 7px 5px 5px; +} + +.jGraduate_tabs { + position: relative; + background-color: #EFEFEF; + padding: 0px; + margin: 0px; + margin-bottom: 5px; +} + +div.jGraduate_Swatch { + display: inline-block; + margin: 8px; +} +div.jGraduate_GradContainer { + border: 2px inset #EEE; + background-image: url(../images/map-opacity.png); + background-position: 0px 0px; + height: 256px; +} + +.jGraduate_AlphaArrows { + position: absolute; + margin-top: -10px; + margin-left: 250.5px; +} + +div.jGraduate_Opacity { + border: 2px inset #eee; + margin-top: 14px; + background-color: black; + background-image: url(../images/Maps.png); + background-position: 0px -2816px; + height: 20px; + cursor: ew-resize; +} + +div.jGraduate_OpacityField { + margin-top: 110px; + margin-left: -10px; +} + +div.jGraduate_Form { + display: inline-block; + vertical-align: top; + width: 140px; + margin: -3px 3px 0px 4px; +} + +div.jGraduate_StopSection { + width: 120px; + text-align: center; +} + +div.jGraduate_OkCancel { + display: inline-block; + vertical-align: top; + width: 113px; +} + +input.jGraduate_Ok, input.jGraduate_Cancel { + display: block; + width: 100px; + margin-left: -4px; + margin-right: -4px; +} +input.jGraduate_Ok { + margin: 9px -4px 5px -4px; +} + +.colorBox { + display: inline-block; + height: 16px; + width: 16px; + border: 1px solid #808080; + vertical-align: -7px; + cursor: pointer; + margin: 4px; +} + +label.jGraduate_Form_Heading { + position: relative; + top: 10px; + background-color: #EFEFEF; + padding: 2px; + font-weight: bold; + font-size: 13px; +} + +div.jGraduate_Form_Section { + border-style: solid; + border-width: 1px; + border-color: grey; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + padding: 15px 5px 5px 5px; + margin: 2px; + width: 110px; + text-align: center; +} + +div.jGraduate_LightBox { + position: fixed; + top: 0px; + left: 0px; + right: 0px; + bottom: 0px; + background-color: #000; + opacity: 0.5; + display: none; +} + +div.jGraduate_stopPicker { + position: absolute; + display: none; + background: #E8E8E8; +} \ No newline at end of file diff --git a/editor/jgraduate/css/jPicker-1.0.9.css b/editor/jgraduate/css/jPicker-1.0.9.css new file mode 100755 index 00000000..c4af17a4 --- /dev/null +++ b/editor/jgraduate/css/jPicker-1.0.9.css @@ -0,0 +1,227 @@ +.jPicker_Picker { + display: inline-block; + height: 24px; /* change this value if using a different sized color picker icon */ + position: relative; /* make this element an absolute positioning container */ + text-align: left; /* make the zero width children position to the left of container */ + width: 25px; /* change this value if using a different sized color picker icon */ +} +.jPicker_Color { + display: block; + height: 100%; + left: 0px; + position: absolute; + top: 0px; + width: 100%; +} +.jPicker_Icon { + background-repeat: no-repeat; + cursor: pointer; + display: block; + height: 100%; + left: 0px; + position: absolute; + top: 0px; + width: 100%; +} +.jPicker_Container { + display: none; + z-index: 10; /* make sure container draws above color picker icon in Firefox/Safari/Chrome/Opera/etc. - + IE calculates z-index so this won't work - we will hide all color picker icons placed after the selected one in code when shown in IE */ +} +.jPicker_table { + background-color: #efefef; + border: 1px outset #666; + font-family: Arial, Helvetica, Sans-Serif; + font-size: 12px; + height: 330px; + margin: 0px; + padding: 5px; + width: 550px; +} +.jPicker_table td { + margin: 0px; + padding: 0px; + vertical-align: top; +} +.jPicker_MoveBar { + background-color: #dddddd; + border: 1px outset #aaa; + cursor: move; + height: 12px; +} +.jPicker_Title { + font-size: 11px !important; + font-weight: bold; + margin: -2px 0px 0px 0px; + padding: 0px; + text-align: center; + width: 100%; +} +.jPicker_ColorMap { + border: 2px inset #eee; + cursor: crosshair; + height: 260px; /* IE 6 incorrectly draws border inside the width and height instead of outside - We will fix this to 256px later */ + margin: 0px 5px 0px 5px; + overflow: hidden; /* hide the overdraw of the Color Map icon when at edge of viewing box */ + padding: 0px; + position: relative; /* make this element an absolute positioning container */ + width: 260px; /* IE 6 incorrectly draws border inside the width and height instead of outside - We will fix this to 256px later */ +} +div[class="jPicker_ColorMap"] { + height: 256px; /* correct to 256px for browsers that support the "[class="xxx"]" selector (IE7+,Firefox,Safari,Chrome,Opera,etc.) */ + width: 256px; /* correct to 256px for browsers that support the "[class="xxx"]" selector (IE7+,Firefox,Safari,Chrome,Opera,etc.) */ +} +.jPicker_ColorMap_l1, .jPicker_ColorMap_l2, .jPicker_ColorMap_l3, .jPicker_ColorBar_l1, .jPicker_ColorBar_l2, .jPicker_ColorBar_l3, .jPicker_ColorBar_l4, .jPicker_ColorBar_l5, .jPicker_AlphaBar_l1, .jPicker_AlphaBar_l2 { + background-repeat: no-repeat; + display: block; + height: 100%; + left: 0px; + position: absolute; + top: 0px; + width: 100%; +} +.jPicker_ColorMap_l1 { + background-color: #000000; + background-image: none; +} +.jPicker_ColorMap_l2 { + background-color: transparent; +} +.jPicker_ColorMap_l3 { + background-repeat: repeat; +} +.jPicker_ColorMap_Arrow { + display: block; + position: absolute; +} +.jPicker_ColorBar { + border: 2px inset #eee; + cursor: n-resize; + height: 260px; /* IE 6 incorrectly draws border inside the width and height instead of outside - We will fix this to 256px later */ + margin: 12px 10px 0px 5px; + padding: 0px; + position: relative; + width: 24px; /* IE 6 incorrectly draws border inside the width and height instead of outside - We will fix this to 20px later */ +} +div[class="jPicker_ColorBar"] { + height: 256px; /* correct to 256px for browsers that support the "[class="xxx"]" selector (IE7+,Firefox,Safari,Chrome,Opera,etc.) */ + width: 20px; /* correct to 20px for browsers that support the "[class="xxx"]" selector (IE7+,Firefox,Safari,Chrome,Opera,etc.) */ +} +.jPicker_ColorBar_l1, .jPicker_ColorBar_l2, .jPicker_ColorBar_l3 { + background-color: transparent; + background-image: none; + background-repeat: repeat-x; +} +.jPicker_ColorBar_l4 { + background-color: transparent; + background-repeat: repeat-x; +} +.jPicker_ColorBar_l5 { + background-color: transparent; + background-repeat: repeat; +} +.jPicker_ColorBar_Arrow { + display: block; + left: -10px; /* (arrow width / 2) - (element width / 2) - position arrows' center in elements' center */ + position: absolute; +} +.jPicker_AlphaBar { + border: 2px inset #eee; + cursor: e-resize; + display: none; + height: 24px; /* IE 6 incorrectly draws border inside the width and height instead of outside - We will fix this to 20px later */ + margin: 10px 5px 4px 5px; + padding: 0px; + position: relative; + width: 260px; /* IE 6 incorrectly draws border inside the width and height instead of outside - We will fix this to 256px later */ +} +div[class="jPicker_AlphaBar"] { + height: 20px; /* correct to 20px for browsers that support the "[class="xxx"]" selector (IE7+,Firefox,Safari,Chrome,Opera,etc.) */ + width: 256px; /* correct to 256px for browsers that support the "[class="xxx"]" selector (IE7+,Firefox,Safari,Chrome,Opera,etc.) */ +} +.jPicker_AlphaBar_Arrow { + display: block; + top: -10px; /* (arrow height / 2) - (element height / 2) - position arrows' center in elements' center */ + position: absolute; +} +.jPicker_EnableAlpha { + text-align: left; +} +.jPicker_Preview { + font-size: x-small; + text-align: center; +} +.jPicker_Preview div { + border: 2px inset #eee; + height: 62px; + margin: 0px auto; + padding: 0px; + width: 62px; +} +.jPicker_Preview div span { + border: 1px solid #000; + display: block; + height: 30px; + margin: 0px auto; + padding: 0px; + width: 60px; +} +.jPicker_Preview div span.jPicker_Active { + border-bottom-width: 0px; +} +.jPicker_Preview div span.jPicker_Current { + border-top-width: 0px; + cursor: pointer; +} +.jPicker_OkCancel { + text-align: center; + width: 120px; +} +.jPicker_OkCancel input { + width: 100px; +} +.jPicker_OkCancel input.jPicker_Ok { + margin: 12px 0px 5px 0px; +} +.jPicker_Spacer { + height: 10px; +} +.jPicker_HueText, .jPicker_SaturationText, .jPicker_BrightnessText, .jPicker_RedText, .jPicker_GreenText, .jPicker_BlueText, .jPicker_AlphaText { + background-color: #fff; + border: 1px inset #aaa; + margin: 0px 0px 0px 5px; + width: 30px; +} +.jPicker_EnterHex { + text-align: right; +} +.jPicker_HexText { + background-color: #fff; + border: 1px inset #aaa; + margin: 0px 19px 0px 5px; + width: 50px; +} +td.jPicker_OpacityCol { + padding-top: 12px; + text-indent: -8px; +} +td.jPicker_OpacityCol * { + display: none; +} +td.jPicker_HexCol { + text-align: left; +} +.jPicker_Grid { + text-align: center; +} +.jPicker_QuickColor { + border: 1px inset #aaa; + cursor: pointer; + display: block; + float: left; + height: 12px; + line-height: 12px; + margin: 2px 3px 1px 3px; + padding: 0px; + width: 12px; +} \ No newline at end of file diff --git a/editor/jgraduate/images/Bars.png b/editor/jgraduate/images/Bars.png new file mode 100644 index 0000000000000000000000000000000000000000..4c1608e3a95febed9dc241b3608cdc6461252bc9 GIT binary patch literal 424 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
    9O$5jC_^PSI=YEb)k;0leQrbV&DnfW6pX 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 GkN*o|BHqsc literal 0 HcmV?d00001 diff --git a/editor/jgraduate/images/bar-opacity.png b/editor/jgraduate/images/bar-opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..e42ad081260dcf697ad046e61356993d4c3c3d5b GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1SGw4HSYi^$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G8lEnWAr-fhY>J=pF!M-AOCP@J!(+klQmE(u|Nrg9=jPdZ eb6Ybo@h~`D<0uF}a@rE8hr!d;&t;ucLK6Vi2PWG9 literal 0 HcmV?d00001 diff --git a/editor/jgraduate/images/map-opacity.png b/editor/jgraduate/images/map-opacity.png new file mode 100644 index 0000000000000000000000000000000000000000..6756cee6df14dabac21fee85d68fd2e30f1873cb GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5XbUj@hLn>}1*%UwHVKz(1$>|B5)7j`^u&Pnwz>oj`>(>aS jpPwhotNJUGfy02oX)8y=1{2rcK#dHZu6{1-oD!M<2x%(! literal 0 HcmV?d00001 diff --git a/editor/jgraduate/images/mappoint.gif b/editor/jgraduate/images/mappoint.gif new file mode 100644 index 0000000000000000000000000000000000000000..f5f855745cfda02dcfa684d3fcd628eadf3d39e8 GIT binary patch literal 93 zcmZ?wbhEHba)%3-gb!1ED&*WW@NAi0RAo>Pyhe` literal 0 HcmV?d00001 diff --git a/editor/jgraduate/images/picker.gif b/editor/jgraduate/images/picker.gif new file mode 100644 index 0000000000000000000000000000000000000000..374d891042f22ff5c23eed3148b6ae5fe2cfdb1c GIT binary patch literal 146 zcmZ?wbhEHblw^=#Sj56`S)_gx__~2Yh?c=8>m+y){r~YPZmz!j+@QWJ- rTTkXiR9;#Y7Lm*_bDc!{( zJaZG%Q-e|yQz{EjrrH1%X?nUihE&{2vMGMX!z^TAX6E+H$nXKH$<(wz|Nq+?{eN?F gbMw(m21Yi9jg}lG!VlE;12r*ty85}Sb4q9e04Z`PX*~6o0ZXGB7YP=m6OaAbAEReG$Etr{7jLaE9#b t7GCi1!@Slr$13Nmrlsthrg<&Q@Rwb&_w{c(pZ$t6RH$3jv4DZW8UXTXBuxMS literal 0 HcmV?d00001 diff --git a/editor/jgraduate/images/rangearrows2.gif b/editor/jgraduate/images/rangearrows2.gif new file mode 100644 index 0000000000000000000000000000000000000000..fdeb54a104447e77b99b7c42b199ad0d85a970a4 GIT binary patch literal 93 zcmZ?wbhEHb&^6s2AQ_8e46`C?&-1$jD#~0B3n3t){q=t;}}if(z<0){z=0;}else{if(z>r){z=r;}}v=Math.floor(q/t*p.mxX);s=Math.floor(z/r*p.mxY);p.x=v;p.y=s;if(p.mxX==p.mnX){q=0;}if(p.mxY==p.mnY){z=0;}p.setArrowPosition(q,z);e.isFunction(p.valuesChanged)&&p.valuesChanged(p);};e.extend(true,p,{settings:k,x:0,y:0,mnX:0,mxX:0,mnY:100,mxY:100,valuesChanged:e.isFunction(arguments[2])&&arguments[2]||null,setPositioningVariables:function(r){var q=p.settings.map;n.w=q&&q.width||n.width();n.h=q&&q.height||n.height();p.MinX=0;p.MinY=0;p.MaxX=n.w;p.MaxY=n.h;},setArrowPositionFromValues:function(t){p.setPositioningVariables();var w=0,v=0,u=p.mnX,r=p.mxX,s=p.mnY,q=p.mxY,A=p.x,z=p.y;if(u!=r){if(A==u){w=0;}else{if(A==r){w=n.w;}else{if(u<1){r+=Math.abs(u)+1;}if(A<1){A+=1;}w=A/r*n.w;if(parseInt(w)==(r-1)){w=r;}else{w=parseInt(w);}if(u<1){w-=Math.abs(u)-1;}}}}if(s!=q){if(z==s){v=0;}else{if(z==q){v=n.h;}else{if(s<1){q+=Math.abs(s)+1;}if(z<1){z+=1;}v=z/q*n.h;if(parseInt(v)==(q-1)){v=q;}else{v=parseInt(v);}if(s<1){v-=Math.abs(s)-1;}}}}p.setArrowPosition(w,v);},setArrowPosition:function(q,v){var u=n.w,s=n.h,t=o.w,r=o.h;if(q<0){q=0;}else{if(q>u){q=u;}}if(v<0){v=0;}else{if(v>s){v=s;}}if(t>u){q=(u>>1)-(t>>1);}else{q-=t>>1;}if(r>s){v=(s>>1)-(r>>1);}else{v-=r>>1;}o.css({left:q+"px",top:v+"px"});},destroy:function(){e(document).unbind("mouseup",j).unbind("mousemove",m);n.unbind("mousedown",l);n=null;o=null;p.valuesChanged=null;}});o.src=p.settings.arrow&&p.settings.arrow.image;o.w=p.settings.arrow&&p.settings.arrow.width||o.width();o.h=p.settings.arrow&&p.settings.arrow.height||o.height();p.setPositioningVariables();n.bind("mousedown",l);p.setArrowPositionFromValues();e.isFunction(p.valuesChanged)&&p.valuesChanged(p);},b=function(n){var m=this,y=function(A){if(A.target.value==""){return;}t(A);m.setValuesFromHsv();e.isFunction(m.valuesChanged)&&m.valuesChanged(m);},s=function(A){if(A.target.value==""){return;}q(A);m.setValuesFromRgb();e.isFunction(m.valuesChanged)&&m.valuesChanged(m);},r=function(A){if(A.target.value==""){return;}l(A);w.a=A.target.value;e.isFunction(m.valuesChanged)&&m.valuesChanged(m);},v=function(A){if(A.target.value==""){m.setValuesFromRgb();}},k=function(A){if(A.target.value==""){m.setValuesFromHsv();}},o=function(A){if(A.target.value==""){u.alpha.val(100);}},z=function(A){if(A.target.value==""){return;}x(A);m.setValuesFromHex();e.isFunction(m.valuesChanged)&&m.valuesChanged(m);},j=function(A){if(A.target.value==""){m.setValuesFromHsv();}},q=function(A){if(!p(A)){return A;}u.red.val(h(u.red.val(),0,255));u.green.val(h(u.green.val(),0,255));u.blue.val(h(u.blue.val(),0,255));},l=function(A){if(!p(A)){return A;}u.alpha.val(h(u.alpha.val(),0,100));},t=function(A){if(!p(A)){return A;}u.hue.val(h(u.hue.val(),0,360));u.saturation.val(h(u.saturation.val(),0,100));u.value.val(h(u.value.val(),0,100));},x=function(A){if(!p(A)){return A;}u.hex.val(u.hex.val().replace(/[^a-fA-F0-9]/g,"0").toLowerCase().substring(0,6));},p=function(A){switch(A.keyCode){case 9:case 16:case 29:case 37:case 38:case 40:return false;case"c".charCodeAt():case"v".charCodeAt():if(A.ctrlKey){return false;}}return true;},h=function(C,B,A){if(C==""||isNaN(C)){return B;}C=parseInt(C);if(C>A){return A;}if(C4){k=l.substring(4,l.length);l=l.substring(0,4);}if(l.length>2){j=l.substring(2,l.length);l=l.substring(0,2);}if(l.length>0){h=l.substring(0,l.length);}}return{r:this.hexToInt(k),g:this.hexToInt(j),b:this.hexToInt(h)};},validateHex:function(h){h=h.toLowerCase().replace(/[^a-f0-9]/g,"0");if(h.length>6){h=h.substring(0,6);}return h;},rgbToHex:function(h){return this.intToHex(h.r)+this.intToHex(h.g)+this.intToHex(h.b);},intToHex:function(j){var h=parseInt(j).toString(16);if(h.length==1){h=("0"+h);}return h.toLowerCase();},hexToInt:function(h){return parseInt(h,16);},rgbToHsv:function(l){var o=l.r/255,n=l.g/255,j=l.b/255,k={h:0,s:0,v:0},m=0,h=0,p;if(o>=n&&o>=j){h=o;m=n>j?j:n;}else{if(n>=j&&n>=o){h=n;m=o>j?j:o;}else{h=j;m=n>o?o:n;}}k.v=h;k.s=h?(h-m)/h:0;if(!k.s){k.h=0;}else{p=h-m;if(o==h){k.h=(n-j)/p;}else{if(n==h){k.h=2+(j-o)/p;}else{k.h=4+(o-n)/p;}}k.h=parseInt(k.h*60);if(k.h<0){k.h+=360;}}k.s=parseInt(k.s*100);k.v=parseInt(k.v*100);return k;},hsvToRgb:function(n){var r={r:0,g:0,b:0},m=n.h,x=n.s,u=n.v;if(x==0){if(u==0){r.r=r.g=r.b=0;}else{r.r=r.g=r.b=parseInt(u*255/100);}}else{if(m==360){m=0;}m/=60;x=x/100;u=u/100;var l=parseInt(m),o=m-l,k=u*(1-x),j=u*(1-(x*o)),w=u*(1-(x*(1-o)));switch(l){case 0:r.r=u;r.g=w;r.b=k;break;case 1:r.r=j;r.g=u;r.b=k;break;case 2:r.r=k;r.g=u;r.b=w;break;case 3:r.r=k;r.g=j;r.b=u;break;case 4:r.r=w;r.g=k;r.b=u;break;case 5:r.r=u;r.g=k;r.b=j;break;}r.r=parseInt(r.r*255);r.g=parseInt(r.g*255);r.b=parseInt(r.b*255);}return r;}}};var f=e.jPicker.Color,c=e.jPicker.List,g=e.jPicker.ColorMethods;e.fn.jPicker=function(j){var h=arguments;return this.each(function(){var w=e(this),y=e.extend(true,{},e.fn.jPicker.defaults,j);if(w.get(0).nodeName.toLowerCase()=="input"){e.extend(true,y,{window:{bindToInput:true,expandable:true,input:w}});if(g.validateHex(w.val())){y.color.active=new f({hex:w.val(),a:y.color.active.a});y.color.current=new f({hex:w.val(),a:y.color.active.a});}}if(y.window.expandable){w.after('   ');}else{y.window.liveUpdate=false;}var W=parseFloat(navigator.appVersion.split("MSIE")[1])<7&&document.body.filters,ax=null,aw=null,av=null,U=null,T=null,S=null,R=null,Q=null,aC=null,V=null,au=null,J=null,I=null,X=null,ac=null,az=null,ak=null,am=null,ao=null,K=null,G=null,aa=null,L=null,ay=null,P=null,O=null,at=null,aq=null,A=null,l=null,M=null,ap=null,ad=null,ai=null,n=null,C=null,u=null,an=function(aE){N.active=ay.color;var aF=N.active,aG=p.clientPath,aD=function(aH){ae(aH,100);aH.css({backgroundColor:"",backgroundPosition:"0px 0px",filter:""});};aD(ax);aD(aw);aD(U);aD(T);aD(S);aD(R);ac.add(az).add(ak).add(am).add(ao).add(K).removeAttr("checked");switch(aE){case"h":ac.attr("checked",true);ax.css({backgroundColor:"#"+aF.hex});aw.css({backgroundColor:"transparent"});x(aw,-256);ae(aw,100);x(R,-256);G.mxX=100;G.mxY=100;aa.mxY=360;break;case"s":az.attr("checked",true);x(ax,-512);x(aw,-768);ae(aw,0);z(S,aF.hex);x(R,-512);G.mxX=360;G.mxY=100;aa.mxY=100;break;case"v":ak.attr("checked",true);z(ax,"000");x(aw,-1024);S.css({backgroundColor:"#"+aF.hex});x(R,-768);G.mxX=360;G.mxY=100;aa.mxY=100;break;case"r":am.attr("checked",true);x(aw,-1536);x(ax,-1280);x(R,-1024);x(S,-1280);x(T,-1536);x(U,-1792);break;case"g":ao.attr("checked",true);x(aw,-2048);x(ax,-1792);x(R,-2048);x(S,-2304);x(T,-2560);x(U,-2816);break;case"b":K.attr("checked",true);x(aw,-2560);x(ax,-2304);x(R,-3072);x(S,-3328);x(T,-3584);x(U,-3840);break;default:throw ("Invalid Mode");break;}switch(aE){case"h":case"s":case"v":G.mnX=1;G.mnY=1;aa.mnY=1;break;case"r":case"g":case"b":G.mnX=0;G.mnY=0;aa.mnY=0;G.mxX=255;G.mxY=255;aa.mxY=255;break;}N.mode=aE;v();ar();ab();if(aj.expandable&&aj.liveUpdate){n.css({backgroundColor:"#"+aF.hex});if(aj.bindToInput){aj.input.val(aF.hex).css({backgroundColor:"#"+aF.hex,color:aF.v>75?"#000000":"#ffffff"});}}e.isFunction(w.liveCallback)&&w.liveCallback(aF);},m=function(){v();ah();N.active=ay.color;var aD=N.active;if(aj.expandable&&aj.liveUpdate){n.css({backgroundColor:"#"+aD.hex});if(aj.bindToInput){aj.input.val(ay.fields.hex.val()).css({backgroundColor:"#"+aD.hex,color:aD.v>75?"#000000":"#ffffff"});}}e.isFunction(w.liveCallback)&&w.liveCallback(aD);},B=function(){if(!ay||!G||!aa||!L){return;}N.active=ay.color;var aD=ay.fields,aE=N.active;switch(N.mode){case"h":aD.saturation.val(G.x);aD.value.val(100-G.y);break;case"s":aD.hue.val(G.x);aD.value.val(100-G.y);break;case"v":aD.hue.val(G.x);aD.saturation.val(100-G.y);break;case"r":aD.blue.val(G.x);aD.green.val(255-G.y);break;case"g":aD.blue.val(G.x);aD.red.val(255-G.y);break;case"b":aD.red.val(G.x);aD.green.val(255-G.y);break;}switch(N.mode){case"h":case"s":case"v":ay.setValuesFromHsv();break;case"r":case"g":case"b":ay.setValuesFromRgb();break;}ah();if(aj.expandable&&aj.liveUpdate){n.css({backgroundColor:"#"+aE.hex});if(aj.bindToInput){aj.input.val(aE.hex).css({backgroundColor:"#"+aE.hex,color:aE.v>75?"#000000":"#ffffff"});}}e.isFunction(w.liveCallback)&&w.liveCallback(aE);},al=function(){if(!ay||!G||!aa||!L){return;}N.active=ay.color;var aD=ay.fields,aE=N.active;switch(N.mode){case"h":aD.hue.val(360-aa.y);break;case"s":aD.saturation.val(100-aa.y);break;case"v":aD.value.val(100-aa.y);break;case"r":aD.red.val(255-aa.y);break;case"g":aD.green.val(255-aa.y);break;case"b":aD.blue.val(255-aa.y);break;}switch(N.mode){case"h":case"s":case"v":ay.setValuesFromHsv();break;case"r":case"g":case"b":ay.setValuesFromRgb();break;}ah();if(aj.expandable&&aj.liveUpdate){n.css({backgroundColor:"#"+aE.hex});if(aj.bindToInput){aj.input.val(aE.hex).css({backgroundColor:"#"+aE.hex,color:aE.v>75?"#000000":"#ffffff"});}}e.isFunction(w.liveCallback)&&w.liveCallback(aE);},s=function(){if(!ay||!G||!aa||!L){return;}N.active=ay.color;var aD=ay.fields,aE=N.active;aD.alpha.val(L.x);ay.setAlphaFromValue();ah();e.isFunction(w.liveCallback)&&w.liveCallback(N.active);},v=function(){N.active=ay.color;var aG=0,aF=N.active;switch(w.settings.color.mode){case"h":aG=360-aF.h;break;case"s":aG=100-aF.s;break;case"v":aG=100-aF.v;break;case"r":aG=255-aF.r;break;case"g":aG=255-aF.g;break;case"b":aG=255-aF.b;break;}aa.y=aG;L.x=aF.a;aa.setArrowPositionFromValues();L.setArrowPositionFromValues();var aE=0,aD=0;switch(w.settings.color.mode){case"h":aE=aF.s;aD=100-aF.v;break;case"s":aE=aF.h;aD=100-aF.v;break;case"v":aE=aF.h;aD=100-aF.s;break;case"r":aE=aF.b;aD=256-aF.g;break;case"g":aE=aF.b;aD=256-aF.r;break;case"b":aE=aF.r;aD=256-aF.g;break;}G.x=aE;G.y=aD;G.setArrowPositionFromValues();},ah=function(){aB();ar();ab();aA();},aB=function(){try{A.css({backgroundColor:"#"+ay.color.hex});ae(A,ay.color.a);}catch(aD){}},ar=function(){if(!N||!ay){return;}N.active=ay.color;var aD=N.active;switch(N.mode){case"h":z(ax,new f({h:aD.h,s:100,v:100}).hex);break;case"s":ae(aw,100-aD.s);break;case"v":ae(aw,aD.v);break;case"r":ae(aw,aD.r/256*100);break;case"g":ae(aw,aD.g/256*100);break;case"b":ae(aw,aD.b/256*100);break;}ae(av,100-aD.a);},ab=function(){if(!N||!ay){return;}N.active=ay.color;var aH=N.active,aK=N.mode,aM=ay.fields;switch(aK){case"h":break;case"s":var aI=new f({h:aH.h,s:100,v:aH.v});z(S,aI.hex);break;case"v":var aL=new f({h:aH.h,s:aH.s,v:100});z(S,aL.hex);break;case"r":case"g":case"b":var aJ=0,aN=0;if(aK=="r"){aJ=aM.blue.val();aN=aM.green.val();}else{if(aK=="g"){aJ=aM.blue.val();aN=aM.red.val();}else{if(aK=="b"){aJ=aM.red.val();aN=aM.green.val();}}}var aD=aJ/256*100,aG=aN/256*100,aF=(256-aJ)/256*100,aE=(256-aN)/256*100;ae(R,aG>aF?aF:aG);ae(S,aG>aD?aD:aG);ae(T,aE>aD?aD:aE);ae(U,aE>aF?aF:aE);break;}ae(Q,100-aH.a);},aA=function(){z(J,ay.color.hex);},z=function(aD,aF){try{aD.css({backgroundColor:"#"+aF});}catch(aE){}},t=function(aD,aE){if(aE.indexOf("png")&&this.isLessThanIE7){aD.attr("pngSrc",aE);aD.css({backgroundImage:"none",filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+aE+"')"});}else{aD.css({backgroundImage:"url("+aE+")"});}},x=function(aD,aE){aD.css({backgroundPosition:"0px "+aE+"px"});},ae=function(aE,aD){if(aD<100){if(this.isLessThanIE7){var aF=aE.attr("pngSrc");if(aF!=null&&aF.indexOf("map-hue")==-1){aE.css({filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+aF+"') progid:DXImageTransform.Microsoft.Alpha(opacity="+aD+")"});}}else{aE.css({opacity:aD/100});}}else{if(aD==100){if(this.isLessThanIE7){var aF=aE.attr("pngSrc");if(aF!=null&&aF.indexOf("map-hue")==-1){aE.css({filter:"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+aF+"')"});}}else{aE.css({opacity:""});}}}},E=function(){ay.fields.hex.val(N.current.hex);ay.fields.alpha.val(N.current.a);ay.setValuesFromHex();ay.setAlphaFromValue();e.isFunction(ay.valuesChanged)&&ay.valuesChanged(ay);},D=function(aD){an(aD.target.value);},af=function(){E();},r=function(){E();aj.expandable&&w.hide();e.isFunction(w.cancelCallback)&&w.cancelCallback();},Z=function(){var aD=N.active;N.current=new f({hex:aD.hex});N.current.a=aD.a;l.css({backgroundColor:"#"+aD.hex});ae(l,ay.color.a);if(aj.expandable){n.css({backgroundColor:"#"+aD.hex});if(aj.bindToInput){aj.input.val(aD.hex).css({backgroundColor:"#"+aD.hex,color:aD.v>75?"#000000":"#ffffff"});}}e.isFunction(w.commitCallback)&&w.commitCallback(aD);},o=function(){Z();aj.expandable&&w.hide();},ag=function(){w.show();},Y=function(aF){var aD=aj.element,aE=aj.page;P=parseInt(X.css("left"));O=parseInt(X.css("top"));at=aF.pageX;aq=aF.pageY;e(document).bind("mousemove",k).bind("mouseup",q);aF.stopPropagation();aF.preventDefault();return false;},k=function(aD){X.css({left:P-(at-aD.pageX)+"px",top:O-(aq-aD.pageY)+"px"});aD.stopPropagation();aD.preventDefault();return false;},q=function(aD){e(document).unbind("mousemove",k).unbind("mouseup",q);aD.stopPropagation();aD.preventDefault();return false;},F=function(aD){ay.fields.hex.val(w.settings.window.input.val());ay.bindedHexKeyUp(aD);},H=function(aD){ay.fields.hex.val(N.quickList[aD.data.i].hex);ay.fields.alpha.val(N.quickList[aD.data.i].a);ay.setValuesFromHex();ay.setAlphaFromValue();e.isFunction(ay.valuesChanged)&&ay.valuesChanged(ay);};e.extend(true,w,{id:w.attr("id"),settings:y,color:null,icon:null,commitCallback:e.isFunction(h[1])&&h[1]||null,liveCallback:e.isFunction(h[2])&&h[2]||null,cancelCallback:e.isFunction(h[3])&&h[3]||null,show:function(){if(document.all){var aD=false;for(i=0;i>1)-259)-w.next().offset().left+"px":aj.position.x,position:"absolute",top:aj.position.y=="top"?"-340px":aj.position.y=="center"?"-153px":aj.position.y=="bottom"?"25px":aj.position.y});}if((typeof(N.active)).toString().toLowerCase()=="string"){N.active=new f({hex:N.active.substring(1)});}if(!N.alphaSupport){N.active.a=100;}X.html(''+(aj.expandable?'':"")+'
     

    '+(aj.title||"Drag Markers To Pick A Color")+'

       
         
    new
      
    current

     
    °
    %
    %
     
      
    % 
    ');ac=e(".jPicker_HueRadio",X);az=e(".jPicker_SaturationRadio",X);ak=e(".jPicker_BrightnessRadio",X);am=e(".jPicker_RedRadio",X);ao=e(".jPicker_GreenRadio",X);K=e(".jPicker_BlueRadio",X);ax=e(".jPicker_ColorMap_l1",X);aw=e(".jPicker_ColorMap_l2",X);av=e(".jPicker_ColorMap_l3",X);U=e(".jPicker_ColorBar_l1",X);T=e(".jPicker_ColorBar_l2",X);S=e(".jPicker_ColorBar_l3",X);R=e(".jPicker_ColorBar_l4",X);Q=e(".jPicker_ColorBar_l5",X);J=e(".jPicker_AlphaBar_l1",X);I=e(".jPicker_AlphaBar_l2",X);aC=e(".jPicker_EnableAlpha",X);V=e(".jPicker_AlphaCheckbox",X);au=e(".jPicker_AlphaBar",X);M=e(".jPicker_NewCurrent",X);A=e(".jPicker_Active",X).css({backgroundColor:"#"+N.active.hex});l=e(".jPicker_Current",X).css({backgroundColor:"#"+N.active.hex});ap=e(".jPicker_Ok",X);ad=e(".jPicker_Cancel",X);ai=e(".jPicker_Grid",X);w.color=e(".Picker_Color");w.icon=e(".jPicker_Icon");ay=new b(X,m);G=new d(e(".jPicker_ColorMap",X),{map:{width:p.colorMap.width,height:p.colorMap.height},arrow:{image:p.clientPath+p.colorMap.arrow.file,width:p.colorMap.arrow.width,height:p.colorMap.arrow.height}},B);aa=new d(e(".jPicker_ColorBar",X),{map:{width:p.colorBar.width,height:p.colorBar.height},arrow:{image:p.clientPath+p.colorBar.arrow.file,width:p.colorBar.arrow.width,height:p.colorBar.arrow.height}},al);L=new d(e(".jPicker_AlphaBar",X),{map:{width:p.alphaBar.width,height:p.alphaBar.height},arrow:{image:p.clientPath+p.alphaBar.arrow.file,width:p.alphaBar.arrow.width,height:p.alphaBar.arrow.height}},s);L.mnX=0;L.mxX=100;t(ax,p.clientPath+"Maps.png");t(aw,p.clientPath+"Maps.png");t(av,p.clientPath+"map-opacity.png");t(U,p.clientPath+"Bars.png");t(T,p.clientPath+"Bars.png");t(S,p.clientPath+"Bars.png");t(R,p.clientPath+"Bars.png");t(Q,p.clientPath+"bar-opacity.png");t(I,p.clientPath+"Maps.png");x(I,-2816);t(M,p.clientPath+"preview-opacity.png");M.css({backgroundPosition:"1px 1px"});if(N.alphaSupport){aC.hide();au.show();e("td.jPicker_OpacityCol *",X).show();}else{V.bind("click",function(){aC.hide();au.show();e("td.jPicker_OpacityCol *",X).show();});}if(aj.expandable){n=e(".jPicker_Color",w.next()).css({backgroundColor:"#"+N.active.hex});C=e(".jPicker_Icon",w.next()).css({backgroundImage:"url("+p.clientPath+p.picker.file+")"}).bind("click",ag);if(aj.bindToInput){aj.input.bind("keyup",F).bind("change",F);}}ac.add(az).add(ak).add(am).add(ao).add(K).bind("click",D);l.bind("click",af);ad.bind("click",r);ap.bind("click",o);if(aj.expandable){u=e(".jPicker_MoveBar",X).bind("mousedown",Y);}if(N.quickList&&N.quickList.length>0){ai.html("");for(i=0;i ');e(".jPicker_QuickColor",X).eq(i).css({backgroundColor:"#"+N.quickList[i].hex}).bind("click",{i:i},H);}}an(N.mode);ay.fields.hex.val(aa.hex);ay.setValuesFromHex();ay.setAlphaFromValue();v();ah();if(!aj.expandable){w.show();}c.push(w);});};e.fn.jPicker.defaults={window:{title:null,position:{x:"screenCenter",y:"top"},expandable:false,liveUpdate:true},color:{mode:"h",active:new f({hex:"ffc000"}),alphaSupport:false,quickList:[new f({h:360,s:33,v:100}),new f({h:360,s:66,v:100}),new f({h:360,s:100,v:100}),new f({h:360,s:100,v:75}),new f({h:360,s:100,v:50}),new f({h:180,s:0,v:100}),new f({h:30,s:33,v:100}),new f({h:30,s:66,v:100}),new f({h:30,s:100,v:100}),new f({h:30,s:100,v:75}),new f({h:30,s:100,v:50}),new f({h:180,s:0,v:90}),new f({h:60,s:33,v:100}),new f({h:60,s:66,v:100}),new f({h:60,s:100,v:100}),new f({h:60,s:100,v:75}),new f({h:60,s:100,v:50}),new f({h:180,s:0,v:80}),new f({h:90,s:33,v:100}),new f({h:90,s:66,v:100}),new f({h:90,s:100,v:100}),new f({h:90,s:100,v:75}),new f({h:90,s:100,v:50}),new f({h:180,s:0,v:70}),new f({h:120,s:33,v:100}),new f({h:120,s:66,v:100}),new f({h:120,s:100,v:100}),new f({h:120,s:100,v:75}),new f({h:120,s:100,v:50}),new f({h:180,s:0,v:60}),new f({h:150,s:33,v:100}),new f({h:150,s:66,v:100}),new f({h:150,s:100,v:100}),new f({h:150,s:100,v:75}),new f({h:150,s:100,v:50}),new f({h:180,s:0,v:50}),new f({h:180,s:33,v:100}),new f({h:180,s:66,v:100}),new f({h:180,s:100,v:100}),new f({h:180,s:100,v:75}),new f({h:180,s:100,v:50}),new f({h:180,s:0,v:40}),new f({h:210,s:33,v:100}),new f({h:210,s:66,v:100}),new f({h:210,s:100,v:100}),new f({h:210,s:100,v:75}),new f({h:210,s:100,v:50}),new f({h:180,s:0,v:30}),new f({h:240,s:33,v:100}),new f({h:240,s:66,v:100}),new f({h:240,s:100,v:100}),new f({h:240,s:100,v:75}),new f({h:240,s:100,v:50}),new f({h:180,s:0,v:20}),new f({h:270,s:33,v:100}),new f({h:270,s:66,v:100}),new f({h:270,s:100,v:100}),new f({h:270,s:100,v:75}),new f({h:270,s:100,v:50}),new f({h:180,s:0,v:10}),new f({h:300,s:33,v:100}),new f({h:300,s:66,v:100}),new f({h:300,s:100,v:100}),new f({h:300,s:100,v:75}),new f({h:300,s:100,v:50}),new f({h:180,s:0,v:0}),new f({h:330,s:33,v:100}),new f({h:330,s:66,v:100}),new f({h:330,s:100,v:100}),new f({h:330,s:100,v:75}),new f({h:330,s:100,v:50})]},images:{clientPath:"/jPicker/images/",colorMap:{width:256,height:256,arrow:{file:"mappoint.gif",width:15,height:15}},colorBar:{width:20,height:256,arrow:{file:"rangearrows.gif",width:40,height:9}},alphaBar:{width:256,height:20,arrow:{file:"rangearrows2.gif",width:9,height:40}},picker:{file:"picker.gif",width:25,height:24}}};})(jQuery,"1.0.9"); \ No newline at end of file diff --git a/editor/jgraduate/jquery.jgraduate.js b/editor/jgraduate/jquery.jgraduate.js new file mode 100644 index 00000000..4fe55203 --- /dev/null +++ b/editor/jgraduate/jquery.jgraduate.js @@ -0,0 +1,529 @@ +/* + * jGraduate 0.2.x + * + * jQuery Plugin for a gradient picker + * + * Copyright (c) 2009 Jeff Schiller + * http://blog.codedread.com/ + * + * Apache 2 License + +jGraduate( options, okCallback, cancelCallback ) + +where options is an object literal: + { + window: { title: "Pick the start color and opacity for the gradient" }, + images: { clientPath: "images/" }, + paint: a Paint object + } + +- the Paint object is: + { + // object describing the color picked used by jPicker + solidColor: { hex, }, + // DOM node for the linear gradient + linearGradient: { grad, a, + } +- only one of solidColor and linearGradient must be non-null + +- picker accepts the following object as input: + { + okCallback: function to call when Ok is pressed + cancelCallback: function to call when Cancel is pressed + paint: object describing the paint to display initially, if not set, then default to opaque white + } + +- okCallback receives a Paint object + + * + */ +var ns = { svg: 'http://www.w3.org/2000/svg', xlink: 'http://www.w3.org/1999/xlink' }; +if(!window.console) { + window.console = new function() { + this.log = function(str) {}; + this.dir = function(str) {}; + }; +} +$.jGraduate = { + Paint: + function(copy) { + if (copy) { + if (copy.solidColor) + this.solidColor = new $.jPicker.Color({ hex: copy.solidColor.hex, + a: copy.solidColor.a }); + + // FIXME: linearGradient can be an object, but .grad can still be null + if (copy.linearGradient) + // Opera throws NOT_SUPPORTED_ERROR if the cloneNode(null), the other browsers do not + this.linearGradient = { grad: copy.linearGradient.grad ? document.cloneNode(copy.linearGradient.grad, true) : null, + a: copy.linearGradient.a }; + } + else { + this.solidColor = new $.jPicker.Color({ hex: '000000', a: 100 }); + this.linearGradient = { grad: null, a: 100 }; + } + } +}; + +jQuery.fn.jGraduateDefaults = { + paint: new $.jGraduate.Paint(), + window: { + pickerTitle: "Drag markers to pick a paint", + }, + images: { + clientPath: "images/", + }, +}; + +jQuery.fn.jGraduate = + function(options) { + var $arguments = arguments; + return this.each( function() { + var $this = $(this), $settings = $.extend(true, {}, jQuery.fn.jGraduateDefaults, options), + id = $this.attr('id'), + idref = '#'+$this.attr('id')+' '; + + if (!idref) + { + alert('Container element must have an id attribute to maintain unique id strings for sub-elements.'); + return; + } + + var okClicked = function() { + $.isFunction($this.okCallback) && $this.okCallback($this.paint); + $this.hide(); + }, + cancelClicked = function() { + $.isFunction($this.cancelCallback) && $this.cancelCallback(); + $this.hide(); + }; + + $.extend(true, $this, // public properties, methods, and callbacks + { + paint: $settings.paint, + okCallback: $.isFunction($arguments[1]) && $arguments[1] || null, + cancelCallback: $.isFunction($arguments[2]) && $arguments[2] || null, + }); + + var mode = "solidColor", + pos = $this.position(), + color = null; + + if ($this.paint == null) { + $this.paint = { solidColor: new $.jPicker.Color({ hex: 'ffffff', a: 100 }), + linearGradient: { grad: null, a: 100 } }; + } + + if ($this.paint.linearGradient.grad != null) { + mode = "linearGradient"; + $this.paint.solidColor = new $.jPicker.Color({ hex: 'ffffff', a: 100 }); + } + else if ($this.paint.solidColor != null) { + $this.paint.linearGradient = { grad: null, a: 100 }; + } + else { + return null; + } + + $this.addClass('jGraduate_Picker'); + $this.html('
      ' + + '
    • Solid Color
    • ' + + '
    • Linear Gradient
    • ' + + '
    ' + + '
    ' + + '
    '); + var colPicker = $(idref + '> .jGraduate_colPick'); + var lgPicker = $(idref + '> .jGraduate_lgPick'); + + lgPicker.html( + '
    ' + + '

    ' + $settings.window.pickerTitle + '

    ' + + '
    ' + + '
    ' + + '' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '' + + '
    ' + + '' + + '' + + '' + + '' + + '
    ' + + '' + + '
    ' + + '
    ' + + '
    ' + + '' + + '
    ' + + '' + + '' + + '' + + '' + + '
    ' + + '' + + '
    ' + + '
    ' + + '
    ' + + '' + + '%' + + '
    ' + + '
    ' + + '
    ' + + '' + + '' + + '
    ' + + '
    ' + + '
    '); + + // -------------- + // Set up all the SVG elements (the gradient, stops and rectangle) + var MAX = 256, MARGINX = 0, MARGINY = 0, STOP_RADIUS = 15/2, + SIZEX = MAX - 2*MARGINX, SIZEY = MAX - 2*MARGINY; +// var container = document.getElementById(id+'_jGraduate_Swatch'); + var container = document.getElementById(id+'_jGraduate_GradContainer'); + var svg = container.appendChild(document.createElementNS(ns.svg, 'svg')); + svg.id = id+'_jgraduate_svg'; + svg.setAttribute('width', MAX); + svg.setAttribute('height', MAX); + svg.setAttribute("xmlns", ns.svg); + + if ($this.paint.linearGradient.grad) { + $this.paint.linearGradient.grad = svg.appendChild( document.importNode($this.paint.linearGradient.grad, true) ); + $this.paint.linearGradient.grad.id = id+'_jgraduate_grad'; + } + else { + var grad = svg.appendChild(document.createElementNS(ns.svg, 'linearGradient')); + grad.id = id+'_jgraduate_grad'; + grad.setAttribute('x1','0.0'); + grad.setAttribute('y1','0.0'); + grad.setAttribute('x2','1.0'); + grad.setAttribute('y2','1.0'); + + var begin = grad.appendChild(document.createElementNS(ns.svg, 'stop')); + begin.setAttribute('offset', '0.0'); + begin.setAttribute('stop-color', '#ff0000'); + + var end = grad.appendChild(document.createElementNS(ns.svg, 'stop')); + end.setAttribute('offset', '1.0'); + end.setAttribute('stop-color', '#ff0'); + + $this.paint.linearGradient.grad = grad; + } + + var gradalpha = $this.paint.linearGradient.a; + $('#' + id + '_jGraduate_OpacityInput').val(gradalpha); + var posx = parseInt(255*(gradalpha/100)) - 4.5; + $('#' + id + '_jGraduate_AlphaArrows').css({'margin-left':posx}); + $('#' + id + '_jgraduate_rect').attr('fill-opacity', gradalpha/100); + + var x1 = parseFloat($this.paint.linearGradient.grad.getAttribute('x1')||0.0); + var y1 = parseFloat($this.paint.linearGradient.grad.getAttribute('y1')||0.0); + var x2 = parseFloat($this.paint.linearGradient.grad.getAttribute('x2')||1.0); + var y2 = parseFloat($this.paint.linearGradient.grad.getAttribute('y2')||0.0); + + var rect = document.createElementNS(ns.svg, 'rect'); + rect.id = id + '_jgraduate_rect'; + rect.setAttribute('x', MARGINX); + rect.setAttribute('y', MARGINY); + rect.setAttribute('width', SIZEY); + rect.setAttribute('height', SIZEY); + rect.setAttribute('fill', 'url(#'+id+'_jgraduate_grad)'); + rect.setAttribute('fill-opacity', '1.0'); + rect = svg.appendChild(rect); + + // stop visuals created here + var beginStop = document.createElementNS(ns.svg, 'image'); + beginStop.id = id + "_stop1"; + beginStop.setAttribute('class', 'stop'); + beginStop.setAttributeNS(ns.xlink, 'href', $settings.images.clientPath + 'mappoint.gif'); + beginStop.setAttributeNS(ns.xlink, "title", "Begin Stop"); + beginStop.appendChild(document.createElementNS(ns.svg, 'title')).appendChild( + document.createTextNode("Begin Stop")); + beginStop.setAttribute('width', 18); + beginStop.setAttribute('height', 18); + beginStop.setAttribute('x', MARGINX + SIZEX*x1 - STOP_RADIUS); + beginStop.setAttribute('y', MARGINY + SIZEY*y1 - STOP_RADIUS); + beginStop.setAttribute('cursor', 'move'); + // must append only after setting all attributes due to Webkit Bug 27952 + // https://bugs.webkit.org/show_bug.cgi?id=27592 + beginStop = svg.appendChild(beginStop); + + var endStop = document.createElementNS(ns.svg, 'image'); + endStop.id = id + "_stop2"; + endStop.setAttribute('class', 'stop'); + endStop.setAttributeNS(ns.xlink, 'href', $settings.images.clientPath + 'mappoint.gif'); + endStop.setAttributeNS(ns.xlink, "title", "End Stop"); + endStop.appendChild(document.createElementNS(ns.svg, 'title')).appendChild( + document.createTextNode("End Stop")); + endStop.setAttribute('width', 18); + endStop.setAttribute('height', 18); + endStop.setAttribute('x', MARGINX + SIZEX*x2 - STOP_RADIUS); + endStop.setAttribute('y', MARGINY + SIZEY*y2 - STOP_RADIUS); + endStop.setAttribute('cursor', 'move'); + endStop = svg.appendChild(endStop); + + // bind GUI elements + $('#'+id+'_jGraduate_Ok').bind('click', function() { + $this.paint.solidColor = null; + okClicked(); + }); + $('#'+id+'_jGraduate_Cancel').bind('click', function(paint) { + cancelClicked(); + }); + + var x1 = $this.paint.linearGradient.grad.getAttribute('x1'); + if(!x1) x1 = "0.0"; + x1Input = $('#'+id+'_jGraduate_x1'); + x1Input.val(x1); + x1Input.change( function() { + if (isNaN(parseFloat(this.value)) || this.value < 0.0 || this.value > 1.0) { + this.value = 0.0; + } + $this.paint.linearGradient.grad.setAttribute('x1', this.value); + beginStop.setAttribute('x', MARGINX + SIZEX*this.value - STOP_RADIUS); + }); + + var y1 = $this.paint.linearGradient.grad.getAttribute('y1'); + if(!y1) y1 = "0.0"; + y1Input = $('#'+id+'_jGraduate_y1'); + y1Input.val(y1); + y1Input.change( function() { + if (isNaN(parseFloat(this.value)) || this.value < 0.0 || this.value > 1.0) { + this.value = 0.0; + } + $this.paint.linearGradient.grad.setAttribute('y1', this.value); + beginStop.setAttribute('y', MARGINY + SIZEY*this.value - STOP_RADIUS); + }); + + var x2 = $this.paint.linearGradient.grad.getAttribute('x2'); + if(!x2) x2 = "1.0"; + x2Input = $('#'+id+'_jGraduate_x2'); + x2Input.val(x2); + x2Input.change( function() { + if (isNaN(parseFloat(this.value)) || this.value < 0.0 || this.value > 1.0) { + this.value = 1.0; + } + $this.paint.linearGradient.grad.setAttribute('x2', this.value); + endStop.setAttribute('x', MARGINX + SIZEX*this.value - STOP_RADIUS); + }); + + var y2 = $this.paint.linearGradient.grad.getAttribute('y2'); + if(!y2) y2 = "0.0"; + y2Input = $('#'+id+'_jGraduate_y2'); + y2Input.val(y2); + y2Input.change( function() { + if (isNaN(parseFloat(this.value)) || this.value < 0.0 || this.value > 1.0) { + this.value = 0.0; + } + $this.paint.linearGradient.grad.setAttribute('y2', this.value); + endStop.setAttribute('y', MARGINY + SIZEY*this.value - STOP_RADIUS); + }); + + var stops = $this.paint.linearGradient.grad.getElementsByTagNameNS(ns.svg, 'stop'); + var numstops = stops.length; + // if there are not at least two stops, then + if (numstops < 2) { + while (numstops < 2) { + $this.paint.linearGradient.grad.appendChild( document.createElementNS(ns.svg, 'stop') ); + ++numstops; + } + stops = $this.paint.linearGradient.grad.getElementsByTagNameNS(ns.svg, 'stop'); + } + + var setOpacitySlider = function(e, div) { + var offset = div.offset(); + var x = (e.pageX - offset.left - parseInt(div.css('border-left-width'))); + if (x > 255) x = 255; + if (x < 0) x = 0; + var posx = x - 4.5; + x /= 255; + $('#' + id + '_jGraduate_AlphaArrows').css({'margin-left':posx}); + $('#' + id + '_jgraduate_rect').attr('fill-opacity', x); + x = parseInt(x*100); + $('#' + id + '_jGraduate_OpacityInput').val(x); + $this.paint.linearGradient.a = x; + }; + + // handle dragging on the opacity slider + var bSlidingOpacity = false; + $('.jGraduate_Opacity').mousedown(function(evt) { + setOpacitySlider(evt, $(this)); + bSlidingOpacity = true; + evt.preventDefault(); + }); + $('.jGraduate_Opacity').mousemove(function(evt) { + if (bSlidingOpacity) { + setOpacitySlider(evt, $(this)); + evt.preventDefault(); + } + }); + $('.jGraduate_Opacity').mouseup(function(evt) { + setOpacitySlider(evt, $(this)); + bSlidingOpacity = false; + evt.preventDefault(); + }); + + // handle dragging the stop around the swatch + var draggingStop = null; + var startx = -1, starty = -1; + // for whatever reason, Opera does not allow $('image.stop') here + $('.stop').mousedown(function(evt) { + draggingStop = this; + startx = evt.clientX; + starty = evt.clientY; + evt.preventDefault(); + }); + $('#'+id+'_jgraduate_svg').mousemove(function(evt) { + if (null != draggingStop) { + var dx = evt.clientX - startx; + var dy = evt.clientY - starty; + startx += dx; + starty += dy; + var x = parseFloat(draggingStop.getAttribute('x')) + dx; + var y = parseFloat(draggingStop.getAttribute('y')) + dy; + + // clamp stop to the swatch + if (x < MARGINX - STOP_RADIUS) x = MARGINX - STOP_RADIUS; + if (y < MARGINY - STOP_RADIUS) y = MARGINY - STOP_RADIUS; + if (x > MARGINX + SIZEX - STOP_RADIUS) x = MARGINX + SIZEX - STOP_RADIUS; + if (y > MARGINY + SIZEY - STOP_RADIUS) y = MARGINY + SIZEY - STOP_RADIUS; + + draggingStop.setAttribute('x', x); + draggingStop.setAttribute('y', y); + + // calculate stop offset + var fracx = (x - MARGINX + STOP_RADIUS)/SIZEX; + var fracy = (y - MARGINY + STOP_RADIUS)/SIZEY; + + if (draggingStop.id == (id+'_stop1')) { + x1Input.val(fracx); + y1Input.val(fracy); + $this.paint.linearGradient.grad.setAttribute('x1', fracx); + $this.paint.linearGradient.grad.setAttribute('y1', fracy); + } + else { + x2Input.val(fracx); + y2Input.val(fracy); + $this.paint.linearGradient.grad.setAttribute('x2', fracx); + $this.paint.linearGradient.grad.setAttribute('y2', fracy); + } + + evt.preventDefault(); + } + }); + $('#'+id+'_jgraduate_svg').mouseup(function(evt) { + draggingStop = null; + }); + + var beginColor = stops[0].getAttribute('stop-color'); + if(!beginColor) beginColor = '#000'; + beginColorBox = $('#'+id+'_jGraduate_colorBoxBegin'); + beginColorBox.css({'background-color':beginColor}); + + var beginOpacity = stops[0].getAttribute('stop-opacity'); + if(!beginOpacity) beginOpacity = '1.0'; + $('#'+id+'jGraduate_beginOpacity').html( (beginOpacity*100)+'%' ); + + var endColor = stops[stops.length-1].getAttribute('stop-color'); + if(!endColor) endColor = '#000'; + endColorBox = $('#'+id+'_jGraduate_colorBoxEnd'); + endColorBox.css({'background-color':endColor}); + + var endOpacity = stops[stops.length-1].getAttribute('stop-opacity'); + if(!endOpacity) endOpacity = '1.0'; + $('#'+id+'jGraduate_endOpacity').html( (endOpacity*100)+'%' ); + + $('#'+id+'_jGraduate_colorBoxBegin').click(function() { + $('div.jGraduate_LightBox').show(); + var colorbox = $(this); + color = new $.jPicker.Color({ hex: beginColor.substr(1), a:(parseFloat(beginOpacity)*100) }); + $('#'+id+'_jGraduate_stopPicker').css({'left': 100, 'bottom': 15}).jPicker({ + window: { title: "Pick the start color and opacity for the gradient" }, + images: { clientPath: $settings.images.clientPath }, + color: { active: color, alphaSupport: true } + }, function(color){ + beginColor = '#' + this.settings.color.active.hex; + beginOpacity = this.settings.color.active.a/100; + colorbox.css('background', beginColor); + $('#'+id+'_jGraduate_beginOpacity').html(parseInt(beginOpacity*100)+'%'); + stops[0].setAttribute('stop-color', beginColor); + stops[0].setAttribute('stop-opacity', beginOpacity); + $('div.jGraduate_LightBox').hide(); + $('#'+id+'_jGraduate_stopPicker').hide(); + }, null, function() { + $('div.jGraduate_LightBox').hide(); + $('#'+id+'_jGraduate_stopPicker').hide(); + }); + }); + $('#'+id+'_jGraduate_colorBoxEnd').click(function() { + $('div.jGraduate_LightBox').show(); + var colorbox = $(this); + color = new $.jPicker.Color({ hex: endColor.substr(1), a:(parseFloat(endOpacity)*100) }); + $('#'+id+'_jGraduate_stopPicker').css({'left': 100, 'top': 15}).jPicker({ + window: { title: "Pick the end color and opacity for the gradient" }, + images: { clientPath: $settings.images.clientPath }, + color: { active: color, alphaSupport: true } + }, function(color){ + endColor = '#' + this.settings.color.active.hex; + endOpacity = this.settings.color.active.a/100; + colorbox.css('background', endColor); + $('#'+id+'_jGraduate_endOpacity').html(parseInt(endOpacity*100)+'%'); + stops[1].setAttribute('stop-color', endColor); + stops[1].setAttribute('stop-opacity', endOpacity); + $('div.jGraduate_LightBox').hide(); + $('#'+id+'_jGraduate_stopPicker').hide(); + }, null, function() { + $('div.jGraduate_LightBox').hide(); + $('#'+id+'_jGraduate_stopPicker').hide(); + }); + }); + + // -------------- + + colPicker.jPicker( + { + window: { title: $settings.window.pickerTitle }, + images: { clientPath: $settings.images.clientPath }, + color: { active: $this.paint.solidColor, alphaSupport: true } + }, + function(color) { + $this.paint.solidColor = color; + $this.paint.linearGradient.grad = null; + okClicked(); + }, + null, + function(){ cancelClicked(); } + ); + + $(idref + ' .jGraduate_tab_color').click( function(){ + $(idref + ' .jGraduate_tab_lingrad').removeClass('jGraduate_tab_current'); + $(idref + ' .jGraduate_tab_color').addClass('jGraduate_tab_current'); + lgPicker.hide(); + colPicker.show(); + }); + $(idref + ' .jGraduate_tab_lingrad').click( function(){ + $(idref + ' .jGraduate_tab_color').removeClass('jGraduate_tab_current'); + $(idref + ' .jGraduate_tab_lingrad').addClass('jGraduate_tab_current'); + colPicker.hide(); + lgPicker.show(); + }); + + if (mode == "linearGradient") { + lgPicker.show(); + colPicker.hide(); + $(idref + ' .jGraduate_tab_color').removeClass('jGraduate_tab_current'); + $(idref + ' .jGraduate_tab_lingrad').addClass('jGraduate_tab_current'); + } + else { + colPicker.show(); + lgPicker.hide(); + $(idref + ' .jGraduate_tab_color').addClass('jGraduate_tab_current'); + $(idref + ' .jGraduate_tab_lingrad').removeClass('jGraduate_tab_current'); + } + + $this.show(); + }); + }; diff --git a/editor/svg-editor.css b/editor/svg-editor.css index ca8401ff..db98fb1d 100644 --- a/editor/svg-editor.css +++ b/editor/svg-editor.css @@ -49,14 +49,6 @@ body { cursor: pointer; } -#svg_editor #fill_color { - background: url('images/none.png'); -} - -#svg_editor #stroke_color { - background: #000000; -} - #svg_editor div#palette { float: left; width: 6848px; @@ -103,6 +95,7 @@ body { /* TODO: fix this */ div.color_block { + background-image: url('images/none.png'); display: inline-block; } @@ -191,10 +184,6 @@ div.color_block { padding: 2px; } -#svg_editor #paint_picker { - display: none; -} - #svg_editor #color_picker { position: absolute; display: none; diff --git a/editor/svg-editor.html b/editor/svg-editor.html index befd51d4..731b5fdd 100644 --- a/editor/svg-editor.html +++ b/editor/svg-editor.html @@ -2,17 +2,17 @@ - + + - - + + - @@ -207,9 +207,6 @@ -
    -
    -
    diff --git a/editor/svg-editor.js b/editor/svg-editor.js index f1dcffee..cf06845f 100644 --- a/editor/svg-editor.js +++ b/editor/svg-editor.js @@ -22,6 +22,9 @@ function svg_edit_setup() { var selectedElement = null; var multiselected = false; var editingsource = false; + + var fillPaint = new $.jGraduate.Paint(); + var strokePaint = new $.jGraduate.Paint(); // called when we've selected a different element var selectedChanged = function(window,elems) { @@ -81,21 +84,27 @@ function svg_edit_setup() { // update fill color var fillColor = selectedElement.getAttribute("fill"); + // TODO: get a Paint from this and store in fillPaint ? + // TODO: call setFillPaint() ? svgCanvas.setFillColor(fillColor); if (fillColor == "none") { - fillColor = 'url(\'images/none.png\')'; + fillColor = "none"; fillOpacity = "N/A"; } - $('#fill_color').css('background', fillColor); + // update the rect inside #fill_color + document.getElementById("gradbox_fill").parentNode.firstChild.setAttribute("fill", fillColor); // update stroke color var strokeColor = selectedElement.getAttribute("stroke"); + // TODO: get a Paint from this and store in strokePaint ? + // TODO: call setStrokePaint() ? svgCanvas.setStrokeColor(strokeColor); if (strokeColor == null || strokeColor == "" || strokeColor == "none") { - strokeColor = 'url(\'images/none.png\')'; strokeOpacity = "N/A"; + strokeColor = "none"; } - $('#stroke_color').css('background', strokeColor); + // update the rect inside #fill_color + document.getElementById("gradbox_stroke").parentNode.firstChild.setAttribute("fill", strokeColor); $('#fill_opacity').html(fillOpacity); $('#stroke_opacity').html(strokeOpacity); @@ -200,9 +209,9 @@ function svg_edit_setup() { svgCanvas.bind("selected", selectedChanged); svgCanvas.bind("changed", elementChanged); - var str = '
    ' + var str = '
    ' $.each(palette, function(i,item){ - str += '
    '; + str += '
    '; }); $('#palette').append(str); @@ -244,17 +253,19 @@ function svg_edit_setup() { }); $('.palette_item').click(function(evt){ + var picker = (evt.shiftKey ? "stroke" : "fill"); var id = (evt.shiftKey ? '#stroke_' : '#fill_'); - color = $(this).css('background-color'); + var color = $(this).attr('data-rgb'); + var rectbox = document.getElementById("gradbox_"+picker).parentNode.firstChild; + // Webkit-based browsers returned 'initial' here for no stroke if (color == 'transparent' || color == 'initial') { color = 'none'; - $(id + "color").css('background', 'url(\'images/none.png\')'); $(id + "opacity").html("N/A"); - } else { - $(id + "color").css('background', color); } - if (evt.shiftKey) { + rectbox.setAttribute("fill", color); + + if (evt.shiftKey) { svgCanvas.setStrokeColor(color); if (color != 'none' && $("#stroke_opacity").html() == 'N/A') { svgCanvas.setStrokeOpacity(1.0); @@ -550,18 +561,16 @@ function svg_edit_setup() { $(document).bind('keydown', {combi:'esc', disableInInput: false}, hideSourceEditor); var colorPicker = function(elem) { - var oldbg = elem.css('background'); - var color = elem.css('background-color'); - var oldopacity = "100 %"; - if (elem.attr('id') == 'stroke_color') { - oldopacity = $('#stroke_opacity').html(); - } - if (elem.attr('id') == 'fill_color') { - oldopacity = $('#fill_opacity').html(); - } + var picker = elem.attr('id') == 'stroke_color' ? 'stroke' : 'fill'; + var oldopacity = (picker == 'stroke' ? $('#stroke_opacity').html() : $('#fill_opacity').html()); + + var paint = (picker == 'stroke' ? strokePaint : fillPaint); + var title = (picker == 'stroke' ? 'Pick a Stroke Paint and Opacity' : 'Pick a Fill Paint and Opacity'); + var oldPaint = new $.jGraduate.Paint(paint); var was_none = false; - if (color == 'transparent' || color == 'initial') { - color = new $.jPicker.Color({ hex: 'ffffff', a: 100 }); + + if (paint.solidColor == null && paint.linearGradient == null) { + paint = new $.jGraduate.Paint(); was_none = true; } else { var alpha; @@ -570,53 +579,45 @@ function svg_edit_setup() { } else { alpha = oldopacity.split(' ')[0]; } - if (color.length == 7 && color[0] == '#') { // #hheexx notation - color = new $.jPicker.Color( { hex: color.substring(1,7) , a: alpha } ); - } else if (color.substring(0,4) == 'rgb(' && color[color.length-1] == ')') { // rgb(r,g,b) notation - var rgb = color.substring(4,color.length-1).split(','); - color = new $.jPicker.Color({ r: rgb[0], g: rgb[1], b: rgb[2], a: alpha }); - } else { - color = new $.jPicker.Color({ hex: 'ffffff', a: alpha }); - } } var pos = elem.position(); - var picker = elem.attr('id') == 'stroke_color' ? 'stroke' : 'fill'; - $('#color_picker').css({'left': pos.left - 140, 'bottom': 104 - pos.top}).jPicker({ - window: { title: "Choose the " + picker + " color and opacity"}, - images: { clientPath: "jpicker/images/" }, - color: { active: color, alphaSupport: true } - }, function(color){ - elem.css('background', '#' + this.settings.color.active.hex); - if (elem.attr('id') == 'stroke_color') { - svgCanvas.setStrokeColor('#' + this.settings.color.active.hex); - svgCanvas.setStrokeOpacity(this.settings.color.active.a/100); - $('#stroke_opacity').html(this.settings.color.active.a+" %"); - } else if (elem.attr('id') == 'fill_color') { - svgCanvas.setFillColor('#' + this.settings.color.active.hex); - svgCanvas.setFillOpacity(this.settings.color.active.a/100); - $('#fill_opacity').html(this.settings.color.active.a+" %"); - } - $('#color_picker').hide(); - } - , null - , function(){ - elem.css('background', oldbg); - if (elem.attr('id') == 'stroke_color') { - $('#stroke_opacity').html(oldopacity); - } else if (elem.attr('id') == 'fill_color') { - $('#fill_opacity').html(oldopacity); - } - if (was_none) { - if (elem.attr('id') == 'stroke_color') { - svgCanvas.setStrokeColor('none'); - $('#stroke_opacity').html('N/A'); - } else if (elem.attr('id') == 'fill_color') { - svgCanvas.setFillColor('none'); - $('#fill_opacity').html('N/A'); + $('#color_picker').css({'left': pos.left - 140, 'bottom': 124 - pos.top}).jGraduate( + { + paint: paint, + window: { pickerTitle: title }, + images: { clientPath: "jGraduate/images/" }, + }, + function(p) { + paint.solidColor = p.solidColor; + paint.linearGradient.grad = p.linearGradient.grad; + paint.linearGradient.a = p.linearGradient.a; + + var oldgrad = document.getElementById("gradbox_"+picker); + var svgbox = oldgrad.parentNode; + var rectbox = svgbox.firstChild; + + if (paint.linearGradient.grad) { + svgbox.removeChild(oldgrad); + var newgrad = svgbox.appendChild(document.importNode(paint.linearGradient.grad, true)); + newgrad.id = "gradbox_"+picker; + rectbox.setAttribute("fill", "url(#gradbox_" + picker + ")"); } - } - $('#color_picker').hide(); - }); + else { + rectbox.setAttribute("fill", "#" + paint.solidColor.hex); + } + + if (picker == 'stroke') { + svgCanvas.setStrokePaint(paint); + } + else { + svgCanvas.setFillPaint(paint); + } + + $('#color_picker').hide(); + }, + function(p) { + $('#color_picker').hide(); + }); } function updateToolButtonState() { @@ -657,6 +658,22 @@ function svg_edit_setup() { } } + // set up gradients to be used for the buttons + var svgdocbox = new DOMParser().parseFromString( + '\ + \ + \ + \ + ', 'text/xml'); + + var boxgrad = svgdocbox.getElementById('gradbox_'); + boxgrad.id = 'gradbox_fill'; + $('#fill_color').append( document.importNode(svgdocbox.documentElement,true) ); + + boxgrad.id = 'gradbox_stroke'; + $(svgdocbox.documentElement.firstChild).attr('fill', '#000'); + $('#stroke_color').append( document.importNode(svgdocbox.documentElement,true) ); + $('#fill_color').click(function(){ colorPicker($(this)); updateToolButtonState(); diff --git a/editor/svgcanvas.js b/editor/svgcanvas.js index 04ac8615..87f5c554 100644 --- a/editor/svgcanvas.js +++ b/editor/svgcanvas.js @@ -14,7 +14,7 @@ var svgWhiteList = { "linearGradient": ["id", "x1", "x2", "y1", "y2"], "path": ["d", "fill", "fill-opacity", "id", "stroke", "stroke-opacity", "stroke-width", "stroke-dasharray"], "rect": ["fill", "fill-opacity", "height", "id", "stroke", "stroke-opacity", "stroke-width", "stroke-dasharray", "width", "x", "y"], - "stop": ["id", "stop-color", "stop-opacity"], + "stop": ["id", "offset", "stop-color", "stop-opacity"], "svg": ["id", "height", "width", "xmlns"], "text": ["font-family", "font-size", "font-style", "font-weight", "id", "x", "y"], }; @@ -239,6 +239,7 @@ function SvgCanvas(c) } this.showGrips = function(show) { + // TODO: use suspendRedraw() here for (dir in this.selectorGrips) { this.selectorGrips[dir].setAttribute("display", show ? "inline" : "none"); } @@ -258,6 +259,7 @@ function SvgCanvas(c) } var bbox = bbox || this.selectedElement.getBBox(); var l=bbox.x-offset, t=bbox.y-offset, w=bbox.width+(offset<<1), h=bbox.height+(offset<<1); + // TODO: use suspendRedraw() here selectedBox.x.baseVal.value = l; selectedBox.y.baseVal.value = t; selectedBox.width.baseVal.value = w; @@ -414,6 +416,8 @@ function SvgCanvas(c) var current_resize_mode = "none"; var current_fill = "none"; var current_stroke = "black"; + var current_stroke_paint = null; + var current_fill_paint = null; var current_stroke_width = 1; var current_stroke_style = "none"; var current_opacity = 1; @@ -464,10 +468,17 @@ function SvgCanvas(c) var nodes = svgroot.childNodes; var i = svgroot.childNodes.length; while (i--) { - if (nodes[i].id != "selectorParentGroup" && - Utils.rectsIntersect(rubberBBox, nodes[i].getBBox())) - { - resultList.push(nodes[i]); + // need to do this since the defs has no bbox and causes an exception + // to be thrown in Mozilla + try { +// if (nodes[i].tagName == "defs") continue; + if (nodes[i].id != "selectorParentGroup" && + Utils.rectsIntersect(rubberBBox, nodes[i].getBBox())) + { + resultList.push(nodes[i]); + } + } catch(e) { + // do nothing, this element did not have a bbox } } } @@ -514,14 +525,17 @@ function SvgCanvas(c) }; var assignAttributes = function(node, attrs) { + var handle = svgroot.suspendRedraw(60); for (i in attrs) { node.setAttributeNS(null, i, attrs[i]); } + svgroot.unsuspendRedraw(handle); }; // remove unneeded attributes // makes resulting SVG smaller var cleanupElement = function(element) { + var handle = svgroot.suspendRedraw(60); if (element.getAttribute('fill-opacity') == '1') element.removeAttribute('fill-opacity'); if (element.getAttribute('opacity') == '1') @@ -538,6 +552,7 @@ function SvgCanvas(c) element.removeAttribute('rx') if (element.getAttribute('ry') == '0') element.removeAttribute('ry') + svgroot.unsuspendRedraw(handle); }; var addSvgElementFromJson = function(data) { @@ -644,7 +659,7 @@ function SvgCanvas(c) indent--; if (!bOneLine) { out.push("\n"); - for (i=0; i"); } else { @@ -732,46 +747,56 @@ function SvgCanvas(c) changes["y1"] = selected.y1.baseVal.value; changes["x2"] = selected.x2.baseVal.value; changes["y2"] = selected.y2.baseVal.value; + var handle = svgroot.suspendRedraw(1000); selected.x1.baseVal.value = remapx(selected.x1.baseVal.value); selected.y1.baseVal.value = remapy(selected.y1.baseVal.value); selected.x2.baseVal.value = remapx(selected.x2.baseVal.value); selected.y2.baseVal.value = remapy(selected.y2.baseVal.value); + svgroot.unsuspendRedraw(handle); break; case "circle": changes["cx"] = selected.cx.baseVal.value; changes["cy"] = selected.cy.baseVal.value; changes["r"] = selected.r.baseVal.value; + var handle = svgroot.suspendRedraw(1000); selected.cx.baseVal.value = remapx(selected.cx.baseVal.value); selected.cy.baseVal.value = remapy(selected.cy.baseVal.value); // take the minimum of the new selected box's dimensions for the new circle radius selected.r.baseVal.value = Math.min(selectedBBox.width/2,selectedBBox.height/2); + svgroot.unsuspendRedraw(handle); break; case "ellipse": changes["cx"] = selected.cx.baseVal.value; changes["cy"] = selected.cy.baseVal.value; changes["rx"] = selected.rx.baseVal.value; changes["ry"] = selected.ry.baseVal.value; + var handle = svgroot.suspendRedraw(1000); selected.cx.baseVal.value = remapx(selected.cx.baseVal.value); selected.cy.baseVal.value = remapy(selected.cy.baseVal.value); selected.rx.baseVal.value = scalew(selected.rx.baseVal.value); selected.ry.baseVal.value = scaleh(selected.ry.baseVal.value); + svgroot.unsuspendRedraw(handle); break; case "text": // cannot use x.baseVal.value here because x is a SVGLengthList changes["x"] = selected.getAttribute("x"); changes["y"] = selected.getAttribute("y"); + var handle = svgroot.suspendRedraw(1000); selected.setAttribute("x", remapx(selected.getAttribute("x"))); selected.setAttribute("y", remapy(selected.getAttribute("y"))); + svgroot.unsuspendRedraw(handle); break; case "rect": changes["x"] = selected.x.baseVal.value; changes["y"] = selected.y.baseVal.value; changes["width"] = selected.width.baseVal.value; changes["height"] = selected.height.baseVal.value; + var handle = svgroot.suspendRedraw(1000); selected.x.baseVal.value = remapx(selected.x.baseVal.value); selected.y.baseVal.value = remapy(selected.y.baseVal.value); selected.width.baseVal.value = scalew(selected.width.baseVal.value); selected.height.baseVal.value = scaleh(selected.height.baseVal.value); + svgroot.unsuspendRedraw(handle); break; default: // rect console.log("Unknown shape type: " + selected.tagName); @@ -1143,25 +1168,33 @@ function SvgCanvas(c) selectorManager.requestSelector(selected).resize(selectedBBox); break; case "text": + var handle = svgroot.suspendRedraw(1000); shape.setAttribute("x", x); shape.setAttribute("y", y); + svgroot.unsuspendRedraw(handle); break; case "line": + var handle = svgroot.suspendRedraw(1000); shape.setAttributeNS(null, "x2", x); shape.setAttributeNS(null, "y2", y); + svgroot.unsuspendRedraw(handle); break; case "square": var size = Math.max( Math.abs(x - start_x), Math.abs(y - start_y) ); + var handle = svgroot.suspendRedraw(1000); shape.setAttributeNS(null, "width", size); shape.setAttributeNS(null, "height", size); shape.setAttributeNS(null, "x", start_x < x ? start_x : start_x - size); shape.setAttributeNS(null, "y", start_y < y ? start_y : start_y - size); + svgroot.unsuspendRedraw(handle); break; case "rect": + var handle = svgroot.suspendRedraw(1000); shape.setAttributeNS(null, "x", Math.min(start_x,x)); shape.setAttributeNS(null, "y", Math.min(start_y,y)); shape.setAttributeNS(null, "width", Math.abs(x-start_x)); shape.setAttributeNS(null, "height", Math.abs(y-start_y)); + svgroot.unsuspendRedraw(handle); break; case "circle": var cx = shape.getAttributeNS(null, "cx"); @@ -1172,8 +1205,10 @@ function SvgCanvas(c) case "ellipse": var cx = shape.getAttributeNS(null, "cx"); var cy = shape.getAttributeNS(null, "cy"); + var handle = svgroot.suspendRedraw(1000); shape.setAttributeNS(null, "rx", Math.abs(x - cx) ); shape.setAttributeNS(null, "ry", Math.abs(y - cy) ); + svgroot.unsuspendRedraw(handle); break; case "fhellipse": case "fhrect": @@ -1406,8 +1441,11 @@ function SvgCanvas(c) this.setResolution = function(x, y) { var w = svgroot.getAttribute("width"), h = svgroot.getAttribute("height"); + + var handle = svgroot.suspendRedraw(1000); svgroot.setAttribute("width", x); svgroot.setAttribute("height", y); + svgroot.unsuspendRedraw(handle); addCommandToHistory(new ChangeElementCommand(svgroot, {"width":w,"height":h}, "resolution")); call("changed", [svgroot]); }; @@ -1448,6 +1486,120 @@ function SvgCanvas(c) this.changeSelectedAttribute("fill", val, elems); }; + var findDefs = function() { + var defs = svgroot.getElementsByTagNameNS(svgns, "defs"); + if (defs.length > 0) { + defs = defs[0]; + } + else { + defs = svgroot.insertBefore( svgdoc.createElementNS(svgns, "defs" ), svgroot.firstChild); + } + return defs; + }; + + var findDuplicateGradient = function(grad) { + var defs = findDefs(); + var existing_grads = defs.getElementsByTagNameNS(svgns, "linearGradient"); + var i = existing_grads.length; + while (i--) { + var og = existing_grads.item(i); + if (grad.getAttribute('x1') != og.getAttribute('x1') || + grad.getAttribute('y1') != og.getAttribute('y1') || + grad.getAttribute('x2') != og.getAttribute('x2') || + grad.getAttribute('y2') != og.getAttribute('y2')) + { + continue; + } + + // else could be a duplicate, iterate through stops + var stops = grad.getElementsByTagNameNS(svgns, "stop"); + var ostops = og.getElementsByTagNameNS(svgns, "stop"); + + if (stops.length != ostops.length) { + continue; + } + + var j = stops.length; + while(j--) { + var stop = stops.item(j); + var ostop = ostops.item(j); + + if (stop.getAttribute('offset') != ostop.getAttribute('offset') || + stop.getAttribute('stop-opacity') != ostop.getAttribute('stop-opacity') || + stop.getAttribute('stop-color') != ostop.getAttribute('stop-color')) + { + break; + } + } + + if (j == -1) { + return og; + } + } // for each gradient in defs + + return null; + }; + + // TODO: what to do about the opacity in these functions? + + this.setStrokePaint = function(p) { + current_stroke_paint = p; + if (p.solidColor) { + this.setStrokeColor("#"+p.solidColor.hex); + } + else if(p.linearGradient.grad) { + // find out if there is a duplicate gradient already in the defs + var grad = p.linearGradient.grad; + var duplicate_grad = findDuplicateGradient(grad); + var defs = findDefs(); + + // no duplicate found, so import gradient into defs + if (!duplicate_grad) { + grad = defs.appendChild( svgdoc.importNode(grad, true) ); + + // get next id and set it on the grad + grad.id = getNextId(); + } + else { // use existing gradient + grad = duplicate_grad; + } + + this.setStrokeColor("url(#" + grad.id + ")"); + } + else { +// console.log("none!"); + } + }; + + this.setFillPaint = function(p) { + current_fill_paint = p; + if (p.solidColor) { + this.setFillColor("#"+p.solidColor.hex); + } + else if(p.linearGradient.grad) { + // find out if there is a duplicate gradient already in the defs + var grad = p.linearGradient.grad; + var duplicate_grad = findDuplicateGradient(grad); + var defs = findDefs(); + + // no duplicate found, so import gradient into defs + if (!duplicate_grad) { + grad = defs.appendChild( svgdoc.importNode(grad, true) ); + + // get next id and set it on the grad + grad.id = getNextId(); + } + else { // use existing gradient + grad = duplicate_grad; + } + + this.setFillColor("url(#" + grad.id + ")"); + } + else { +// console.log("none!"); + } + }; + this.getStrokeWidth = function() { return current_stroke_width; }; @@ -1608,6 +1760,7 @@ function SvgCanvas(c) var elems = elems || selectedElements; var batchCmd = new BatchCommand("Change " + attr); var i = elems.length; + var handle = svgroot.suspendRedraw(1000); while(i--) { var elem = elems[i]; if (elem == null) continue; @@ -1623,6 +1776,7 @@ function SvgCanvas(c) batchCmd.addSubCommand(new ChangeElementCommand(elem, changes, attr)); } } + svgroot.unsuspendRedraw(handle); if (!batchCmd.isEmpty()) { addCommandToHistory(batchCmd); call("changed", elems); @@ -1675,7 +1829,11 @@ function SvgCanvas(c) var oldParent = t.parentNode; var oldNextSibling = t.nextSibling; if (oldNextSibling == selectorManager.selectorParentGroup) oldNextSibling = null; - t = t.parentNode.insertBefore(t, t.parentNode.firstChild); + var firstChild = t.parentNode.firstChild; + if (firstChild.tagName == 'defs') { + firstChild = firstChild.nextSibling; + } + t = t.parentNode.insertBefore(t, firstChild); addCommandToHistory(new MoveElementCommand(t, oldNextSibling, oldParent, "bottom")); } };