From fa433f0e6127d8522dd635505d677b507b06e031 Mon Sep 17 00:00:00 2001 From: Matt Bertrand Date: Fri, 29 May 2015 12:15:46 -0400 Subject: [PATCH] Made improvements suggested by @bartvde --- src/script/locale/ca.js | 5 +- src/script/locale/cn.js | 4 +- src/script/locale/de.js | 4 +- src/script/locale/el.js | 33 +- src/script/locale/en.js | 33 +- src/script/locale/es.js | 33 +- src/script/locale/fr.js | 58 +++ src/script/locale/id.js | 33 +- src/script/locale/it.js | 33 +- src/script/locale/nl.js | 33 +- src/script/locale/no.js | 33 +- src/script/locale/pl.js | 33 +- src/script/locale/ru.js | 33 +- src/script/spinner/Spinner.js | 461 ---------------------- src/script/spinner/SpinnerField.js | 74 ---- src/script/widgets/ClassificationPanel.js | 64 +-- src/script/widgets/RulePanel.js | 9 +- src/script/widgets/WMSStylesDialog.js | 78 ++-- src/theme/all.css | 42 -- src/theme/img/spinner.gif | Bin 3186 -> 0 bytes 20 files changed, 434 insertions(+), 662 deletions(-) delete mode 100644 src/script/spinner/Spinner.js delete mode 100644 src/script/spinner/SpinnerField.js delete mode 100644 src/theme/img/spinner.gif diff --git a/src/script/locale/ca.js b/src/script/locale/ca.js index 3b80ba5a..94e809e4 100644 --- a/src/script/locale/ca.js +++ b/src/script/locale/ca.js @@ -373,7 +373,10 @@ GeoExt.Lang.add("ca", { styleWindowTitle: "Estil: {0}", ruleWindowTitle: "Regla: {0}", stylesFieldsetTitle: "Estils", - rulesFieldsetTitle: "Regles" + rulesFieldsetTitle: "Regles", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" + }, "gxp.LayerUploadPanel.prototype": { diff --git a/src/script/locale/cn.js b/src/script/locale/cn.js index 3eb098e1..b99b16dd 100644 --- a/src/script/locale/cn.js +++ b/src/script/locale/cn.js @@ -370,7 +370,9 @@ GeoExt.Lang.add("en", { styleWindowTitle: "用户式样: {0}", ruleWindowTitle: "式样规则: {0}", stylesFieldsetTitle: "式样", - rulesFieldsetTitle: "规则" + rulesFieldsetTitle: "规则", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { diff --git a/src/script/locale/de.js b/src/script/locale/de.js index 02362495..9e42f1c3 100644 --- a/src/script/locale/de.js +++ b/src/script/locale/de.js @@ -374,7 +374,9 @@ GeoExt.Lang.add("de", { styleWindowTitle: "User Style: {0}", ruleWindowTitle: "Style Regel: {0}", stylesFieldsetTitle: "Styles", - rulesFieldsetTitle: "Regeln" + rulesFieldsetTitle: "Regeln", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { diff --git a/src/script/locale/el.js b/src/script/locale/el.js index 992f08df..f63f509e 100644 --- a/src/script/locale/el.js +++ b/src/script/locale/el.js @@ -366,7 +366,9 @@ GeoExt.Lang.add("el", { styleWindowTitle: "Στυλ Χρήστη: {0}", ruleWindowTitle: "Κανόνες Στυλ: {0}", stylesFieldsetTitle: "Στυλ", - rulesFieldsetTitle: "Κανόνες" + rulesFieldsetTitle: "Κανόνες", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { @@ -416,6 +418,35 @@ GeoExt.Lang.add("el", { doneText: "Done", titleText: "Προσθήκη ροής", maxResultsText: "Max Είδη" + }, + + "gxp.ClassificationPanel.prototype": { + classNumberText: 'Classes', + classifyText: "Classify", + rampBlueText: "Blue", + rampRedText: "Red", + rampOrangeText: "Orange", + rampJetText: "Blue-Red", + rampGrayText: "Gray", + rampRandomText: "Random", + rampCustomText: "Custom", + selectColorText: "Select colors", + colorStartText: "Start Color", + colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", + methodUniqueText: "Unique Values", + methodQuantileText: "Quantile", + methodEqualText: "Equal Intervals", + methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", + standardDeviationText: "Standard Deviations", + attributeText: "Attribute", + selectAttributeText: "Select attribute", + startColor: "#FEE5D9", + endColor: "#A50F15", + generateRulesText: "Apply", + reverseColorsText: "Reverse colors" } }); diff --git a/src/script/locale/en.js b/src/script/locale/en.js index d7849aab..31b36a49 100644 --- a/src/script/locale/en.js +++ b/src/script/locale/en.js @@ -374,7 +374,9 @@ GeoExt.Lang.add("en", { styleWindowTitle: "User Style: {0}", ruleWindowTitle: "Style Rule: {0}", stylesFieldsetTitle: "Styles", - rulesFieldsetTitle: "Rules" + rulesFieldsetTitle: "Rules", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { @@ -427,6 +429,35 @@ GeoExt.Lang.add("en", { doneText: "Done", titleText: "Add Feeds", maxResultsText: "Max Items" + }, + + "gxp.ClassificationPanel.prototype": { + classNumberText: 'Classes', + classifyText: "Classify", + rampBlueText: "Blue", + rampRedText: "Red", + rampOrangeText: "Orange", + rampJetText: "Blue-Red", + rampGrayText: "Gray", + rampRandomText: "Random", + rampCustomText: "Custom", + selectColorText: "Select colors", + colorStartText: "Start Color", + colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", + methodUniqueText: "Unique Values", + methodQuantileText: "Quantile", + methodEqualText: "Equal Intervals", + methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", + standardDeviationText: "Standard Deviations", + attributeText: "Attribute", + selectAttributeText: "Select attribute", + startColor: "#FEE5D9", + endColor: "#A50F15", + generateRulesText: "Apply", + reverseColorsText: "Reverse colors" } }); diff --git a/src/script/locale/es.js b/src/script/locale/es.js index 0406b1dd..4ad1fc9f 100644 --- a/src/script/locale/es.js +++ b/src/script/locale/es.js @@ -373,7 +373,9 @@ GeoExt.Lang.add("es", { styleWindowTitle: "Estilo: {0}", ruleWindowTitle: "Regla: {0}", stylesFieldsetTitle: "Estilos", - rulesFieldsetTitle: "Reglas" + rulesFieldsetTitle: "Reglas", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { @@ -423,6 +425,35 @@ GeoExt.Lang.add("es", { doneText: "Hecho", titleText: "Agregar Feeds", maxResultsText: "Productos Max" + }, + + "gxp.ClassificationPanel.prototype": { + classNumberText: 'Classes', + classifyText: "Classify", + rampBlueText: "Blue", + rampRedText: "Red", + rampOrangeText: "Orange", + rampJetText: "Blue-Red", + rampGrayText: "Gray", + rampRandomText: "Random", + rampCustomText: "Custom", + selectColorText: "Select colors", + colorStartText: "Start Color", + colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", + methodUniqueText: "Unique Values", + methodQuantileText: "Quantile", + methodEqualText: "Equal Intervals", + methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", + standardDeviationText: "Standard Deviations", + attributeText: "Attribute", + selectAttributeText: "Select attribute", + startColor: "#FEE5D9", + endColor: "#A50F15", + generateRulesText: "Apply", + reverseColorsText: "Reverse colors" } }); diff --git a/src/script/locale/fr.js b/src/script/locale/fr.js index 24ec3d16..ca0d5d85 100644 --- a/src/script/locale/fr.js +++ b/src/script/locale/fr.js @@ -311,6 +311,35 @@ GeoExt.Lang.add("fr", { largeSizeLabel: 'Large' }, + "gxp.WMSStylesDialog.prototype": { + addStyleText: "Add", + addStyleTip: "Add a new style", + chooseStyleText: "Choose style", + deleteStyleText: "Remove", + deleteStyleTip: "Delete the selected style", + editStyleText: "Edit", + editStyleTip: "Edit the selected style", + duplicateStyleText: "Duplicate", + duplicateStyleTip: "Duplicate the selected style", + addRuleText: "Add", + addRuleTip: "Add a new rule", + newRuleText: "New Rule", + deleteRuleText: "Remove", + deleteRuleTip: "Delete the selected rule", + editRuleText: "Edit", + editRuleTip: "Edit the selected rule", + duplicateRuleText: "Duplicate", + duplicateRuleTip: "Duplicate the selected rule", + cancelText: "Cancel", + saveText: "Save", + styleWindowTitle: "User Style: {0}", + ruleWindowTitle: "Style Rule: {0}", + stylesFieldsetTitle: "Styles", + rulesFieldsetTitle: "Rules", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" + }, + "gxp.LayerUploadPanel.prototype": { titleLabel: "Titre", titleEmptyText: "Titre de la couche", @@ -358,6 +387,35 @@ GeoExt.Lang.add("fr", { doneText: "Terminé", titletext: "Ajouter RSS", maxResultsText: "Articles Max" + }, + + "gxp.ClassificationPanel.prototype": { + classNumberText: 'Classes', + classifyText: "Classify", + rampBlueText: "Blue", + rampRedText: "Red", + rampOrangeText: "Orange", + rampJetText: "Blue-Red", + rampGrayText: "Gray", + rampRandomText: "Random", + rampCustomText: "Custom", + selectColorText: "Select colors", + colorStartText: "Start Color", + colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", + methodUniqueText: "Unique Values", + methodQuantileText: "Quantile", + methodEqualText: "Equal Intervals", + methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", + standardDeviationText: "Standard Deviations", + attributeText: "Attribute", + selectAttributeText: "Select attribute", + startColor: "#FEE5D9", + endColor: "#A50F15", + generateRulesText: "Apply", + reverseColorsText: "Reverse colors" } }); diff --git a/src/script/locale/id.js b/src/script/locale/id.js index b526d9ee..517f52f8 100644 --- a/src/script/locale/id.js +++ b/src/script/locale/id.js @@ -374,7 +374,9 @@ GeoExt.Lang.add("id", { styleWindowTitle: "User Style: {0}", ruleWindowTitle: "Style Rule: {0}", stylesFieldsetTitle: "Styles", - rulesFieldsetTitle: "Rules" + rulesFieldsetTitle: "Rules", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { @@ -424,6 +426,35 @@ GeoExt.Lang.add("id", { doneText: "Selesai", titleText: "Tambah Blog", maxResultsText: "Produk Max" + }, + + "gxp.ClassificationPanel.prototype": { + classNumberText: 'Classes', + classifyText: "Classify", + rampBlueText: "Blue", + rampRedText: "Red", + rampOrangeText: "Orange", + rampJetText: "Blue-Red", + rampGrayText: "Gray", + rampRandomText: "Random", + rampCustomText: "Custom", + selectColorText: "Select colors", + colorStartText: "Start Color", + colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", + methodUniqueText: "Unique Values", + methodQuantileText: "Quantile", + methodEqualText: "Equal Intervals", + methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", + standardDeviationText: "Standard Deviations", + attributeText: "Attribute", + selectAttributeText: "Select attribute", + startColor: "#FEE5D9", + endColor: "#A50F15", + generateRulesText: "Apply", + reverseColorsText: "Reverse colors" } }); diff --git a/src/script/locale/it.js b/src/script/locale/it.js index adfb37d4..5d32cd36 100644 --- a/src/script/locale/it.js +++ b/src/script/locale/it.js @@ -374,7 +374,9 @@ GeoExt.Lang.add("it", { styleWindowTitle: "Stile Utente: {0}", ruleWindowTitle: "Regola dello stile: {0}", stylesFieldsetTitle: "Stili", - rulesFieldsetTitle: "Regole" + rulesFieldsetTitle: "Regole", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { @@ -427,6 +429,35 @@ GeoExt.Lang.add("it", { doneText: "Fatto", titleText: "Aggiungi Feed", maxResultsText: "Numero Max risultati" + }, + + "gxp.ClassificationPanel.prototype": { + classNumberText: 'Classes', + classifyText: "Classify", + rampBlueText: "Blue", + rampRedText: "Red", + rampOrangeText: "Orange", + rampJetText: "Blue-Red", + rampGrayText: "Gray", + rampRandomText: "Random", + rampCustomText: "Custom", + selectColorText: "Select colors", + colorStartText: "Start Color", + colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", + methodUniqueText: "Unique Values", + methodQuantileText: "Quantile", + methodEqualText: "Equal Intervals", + methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", + standardDeviationText: "Standard Deviations", + attributeText: "Attribute", + selectAttributeText: "Select attribute", + startColor: "#FEE5D9", + endColor: "#A50F15", + generateRulesText: "Apply", + reverseColorsText: "Reverse colors" } }); \ No newline at end of file diff --git a/src/script/locale/nl.js b/src/script/locale/nl.js index 947d5039..bdf698b2 100644 --- a/src/script/locale/nl.js +++ b/src/script/locale/nl.js @@ -335,7 +335,9 @@ GeoExt.Lang.add("nl", { styleWindowTitle: "Kaartstijl: {0}", ruleWindowTitle: "Klasse: {0}", stylesFieldsetTitle: "Kaartstijlen", - rulesFieldsetTitle: "Klassen" + rulesFieldsetTitle: "Klassen", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { @@ -385,6 +387,35 @@ GeoExt.Lang.add("nl", { doneText: "Klaar", titleText: "Voeg Feeds", maxResultsText: "Max Items" + }, + + "gxp.ClassificationPanel.prototype": { + classNumberText: 'Classes', + classifyText: "Classify", + rampBlueText: "Blue", + rampRedText: "Red", + rampOrangeText: "Orange", + rampJetText: "Blue-Red", + rampGrayText: "Gray", + rampRandomText: "Random", + rampCustomText: "Custom", + selectColorText: "Select colors", + colorStartText: "Start Color", + colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", + methodUniqueText: "Unique Values", + methodQuantileText: "Quantile", + methodEqualText: "Equal Intervals", + methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", + standardDeviationText: "Standard Deviations", + attributeText: "Attribute", + selectAttributeText: "Select attribute", + startColor: "#FEE5D9", + endColor: "#A50F15", + generateRulesText: "Apply", + reverseColorsText: "Reverse colors" } }); diff --git a/src/script/locale/no.js b/src/script/locale/no.js index 447e957b..4818aba7 100644 --- a/src/script/locale/no.js +++ b/src/script/locale/no.js @@ -374,7 +374,9 @@ GeoExt.Lang.add("no", { styleWindowTitle: "Bruker Stil: {0}", ruleWindowTitle: "Stil regel: {0}", stylesFieldsetTitle: "Stiler", - rulesFieldsetTitle: "Regler" + rulesFieldsetTitle: "Regler", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { @@ -427,6 +429,35 @@ GeoExt.Lang.add("no", { doneText: "Ferdig", titleText: "Legg til Feeds", maxResultsText: "Max elementer" + }, + + "gxp.ClassificationPanel.prototype": { + classNumberText: 'Classes', + classifyText: "Classify", + rampBlueText: "Blue", + rampRedText: "Red", + rampOrangeText: "Orange", + rampJetText: "Blue-Red", + rampGrayText: "Gray", + rampRandomText: "Random", + rampCustomText: "Custom", + selectColorText: "Select colors", + colorStartText: "Start Color", + colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", + methodUniqueText: "Unique Values", + methodQuantileText: "Quantile", + methodEqualText: "Equal Intervals", + methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", + standardDeviationText: "Standard Deviations", + attributeText: "Attribute", + selectAttributeText: "Select attribute", + startColor: "#FEE5D9", + endColor: "#A50F15", + generateRulesText: "Apply", + reverseColorsText: "Reverse colors" } }); diff --git a/src/script/locale/pl.js b/src/script/locale/pl.js index 0fe85998..5de14c4d 100644 --- a/src/script/locale/pl.js +++ b/src/script/locale/pl.js @@ -352,7 +352,9 @@ GeoExt.Lang.add("pl", { styleWindowTitle: "Styl użytkownika: {0}", ruleWindowTitle: "Reguła stylu: {0}", stylesFieldsetTitle: "Style", - rulesFieldsetTitle: "Reguły" + rulesFieldsetTitle: "Reguły", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { @@ -403,6 +405,35 @@ GeoExt.Lang.add("pl", { doneText: "Gotowe", titleText: "Dodaj kanały", maxResultsText: "Rzeczy Max" + }, + + "gxp.ClassificationPanel.prototype": { + classNumberText: 'Classes', + classifyText: "Classify", + rampBlueText: "Blue", + rampRedText: "Red", + rampOrangeText: "Orange", + rampJetText: "Blue-Red", + rampGrayText: "Gray", + rampRandomText: "Random", + rampCustomText: "Custom", + selectColorText: "Select colors", + colorStartText: "Start Color", + colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", + methodUniqueText: "Unique Values", + methodQuantileText: "Quantile", + methodEqualText: "Equal Intervals", + methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", + standardDeviationText: "Standard Deviations", + attributeText: "Attribute", + selectAttributeText: "Select attribute", + startColor: "#FEE5D9", + endColor: "#A50F15", + generateRulesText: "Apply", + reverseColorsText: "Reverse colors" } }); diff --git a/src/script/locale/ru.js b/src/script/locale/ru.js index 0c847eaa..2ac1f560 100644 --- a/src/script/locale/ru.js +++ b/src/script/locale/ru.js @@ -374,7 +374,9 @@ GeoExt.Lang.add("ru", { styleWindowTitle: "Пользовательский стиль: {0}", ruleWindowTitle: "Правило стиля: {0}", stylesFieldsetTitle: "Стили", - rulesFieldsetTitle: "Правила" + rulesFieldsetTitle: "Правила", + classifyStyleText: "Classify", + classifyStyleTip: "Classify the layer based on attributes" }, "gxp.LayerUploadPanel.prototype": { @@ -427,6 +429,35 @@ GeoExt.Lang.add("ru", { doneText: "Готово", titleText: "Добавить каналы", maxResultsText: "Максимальное количество элементов" + }, + + "gxp.ClassificationPanel.prototype": { + classNumberText: 'Classes', + classifyText: "Classify", + rampBlueText: "Blue", + rampRedText: "Red", + rampOrangeText: "Orange", + rampJetText: "Blue-Red", + rampGrayText: "Gray", + rampRandomText: "Random", + rampCustomText: "Custom", + selectColorText: "Select colors", + colorStartText: "Start Color", + colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", + methodUniqueText: "Unique Values", + methodQuantileText: "Quantile", + methodEqualText: "Equal Intervals", + methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", + standardDeviationText: "Standard Deviations", + attributeText: "Attribute", + selectAttributeText: "Select attribute", + startColor: "#FEE5D9", + endColor: "#A50F15", + generateRulesText: "Apply", + reverseColorsText: "Reverse colors" } }); diff --git a/src/script/spinner/Spinner.js b/src/script/spinner/Spinner.js deleted file mode 100644 index bc2738d8..00000000 --- a/src/script/spinner/Spinner.js +++ /dev/null @@ -1,461 +0,0 @@ -/* - This file is part of Ext JS 3.4 - - Copyright (c) 2011-2013 Sencha Inc - - Contact: http://www.sencha.com/contact - - GNU General Public License Usage - This file may be used under the terms of the GNU General Public License version 3.0 as - published by the Free Software Foundation and appearing in the file LICENSE included in the - packaging of this file. - - Please review the following information to ensure the GNU General Public License version 3.0 - requirements will be met: http://www.gnu.org/copyleft/gpl.html. - - If you are unsure which license is appropriate for your use, please contact the sales department - at http://www.sencha.com/contact. - - Build date: 2013-04-03 15:07:25 - */ - -Ext.ns('Ext.ux'); - -/** - * @class Ext.ux.Spinner - * @extends Ext.util.Observable - * Creates a Spinner control utilized by Ext.ux.form.SpinnerField - */ -Ext.ux.Spinner = Ext.extend(Ext.util.Observable, { - incrementValue: 1, - alternateIncrementValue: 5, - triggerClass: 'x-form-spinner-trigger', - splitterClass: 'x-form-spinner-splitter', - alternateKey: Ext.EventObject.shiftKey, - defaultValue: 0, - accelerate: false, - - constructor: function(config){ - Ext.ux.Spinner.superclass.constructor.call(this, config); - Ext.apply(this, config); - this.mimicing = false; - }, - - init: function(field){ - this.field = field; - - field.afterMethod('onRender', this.doRender, this); - field.afterMethod('onEnable', this.doEnable, this); - field.afterMethod('onDisable', this.doDisable, this); - field.afterMethod('afterRender', this.doAfterRender, this); - field.afterMethod('onResize', this.doResize, this); - field.afterMethod('onFocus', this.doFocus, this); - field.beforeMethod('onDestroy', this.doDestroy, this); - }, - - doRender: function(ct, position){ - var el = this.el = this.field.getEl(); - var f = this.field; - - if (!f.wrap) { - f.wrap = this.wrap = el.wrap({ - cls: "x-form-field-wrap" - }); - } - else { - this.wrap = f.wrap.addClass('x-form-field-wrap'); - } - - this.trigger = this.wrap.createChild({ - tag: "img", - src: Ext.BLANK_IMAGE_URL, - cls: "x-form-trigger " + this.triggerClass - }); - - if (!f.width) { - this.wrap.setWidth(el.getWidth() + this.trigger.getWidth()); - } - - this.splitter = this.wrap.createChild({ - tag: 'div', - cls: this.splitterClass, - style: 'width:13px; height:2px;' - }); - this.splitter.setRight((Ext.isIE) ? 1 : 2).setTop(10).show(); - - this.proxy = this.trigger.createProxy('', this.splitter, true); - this.proxy.addClass("x-form-spinner-proxy"); - this.proxy.setStyle('left', '0px'); - this.proxy.setSize(14, 1); - this.proxy.hide(); - this.dd = new Ext.dd.DDProxy(this.splitter.dom.id, "SpinnerDrag", { - dragElId: this.proxy.id - }); - - this.initTrigger(); - this.initSpinner(); - }, - - doAfterRender: function(){ - var y; - if (Ext.isIE && this.el.getY() != (y = this.trigger.getY())) { - this.el.position(); - this.el.setY(y); - } - }, - - doEnable: function(){ - if (this.wrap) { - this.disabled = false; - this.wrap.removeClass(this.field.disabledClass); - } - }, - - doDisable: function(){ - if (this.wrap) { - this.disabled = true; - this.wrap.addClass(this.field.disabledClass); - this.el.removeClass(this.field.disabledClass); - } - }, - - doResize: function(w, h){ - if (typeof w == 'number') { - this.el.setWidth(w - this.trigger.getWidth()); - } - this.wrap.setWidth(this.el.getWidth() + this.trigger.getWidth()); - }, - - doFocus: function(){ - if (!this.mimicing) { - this.wrap.addClass('x-trigger-wrap-focus'); - this.mimicing = true; - Ext.get(Ext.isIE ? document.body : document).on("mousedown", this.mimicBlur, this, { - delay: 10 - }); - this.el.on('keydown', this.checkTab, this); - } - }, - - // private - checkTab: function(e){ - if (e.getKey() == e.TAB) { - this.triggerBlur(); - } - }, - - // private - mimicBlur: function(e){ - if (!this.wrap.contains(e.target) && this.field.validateBlur(e)) { - this.triggerBlur(); - } - }, - - // private - triggerBlur: function(){ - this.mimicing = false; - Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur, this); - this.el.un("keydown", this.checkTab, this); - this.field.beforeBlur(); - this.wrap.removeClass('x-trigger-wrap-focus'); - //this.field.onBlur.call(this.field); - }, - - initTrigger: function(){ - this.trigger.addClassOnOver('x-form-trigger-over'); - this.trigger.addClassOnClick('x-form-trigger-click'); - }, - - initSpinner: function(){ - this.field.addEvents({ - 'spin': true, - 'spinup': true, - 'spindown': true, - 'change' : true - }); - - this.keyNav = new Ext.KeyNav(this.el, { - "up": function(e){ - e.preventDefault(); - this.onSpinUp(); - }, - - "down": function(e){ - e.preventDefault(); - this.onSpinDown(); - }, - - "pageUp": function(e){ - e.preventDefault(); - this.onSpinUpAlternate(); - }, - - "pageDown": function(e){ - e.preventDefault(); - this.onSpinDownAlternate(); - }, - - scope: this - }); - - this.repeater = new Ext.util.ClickRepeater(this.trigger, { - accelerate: this.accelerate - }); - this.field.mon(this.repeater, "click", this.onTriggerClick, this, { - preventDefault: true - }); - - this.field.mon(this.trigger, { - mouseover: this.onMouseOver, - mouseout: this.onMouseOut, - mousemove: this.onMouseMove, - mousedown: this.onMouseDown, - mouseup: this.onMouseUp, - scope: this, - preventDefault: true - }); - - this.field.mon(this.wrap, "mousewheel", this.handleMouseWheel, this); - - this.dd.setXConstraint(0, 0, 10) - this.dd.setYConstraint(1500, 1500, 10); - this.dd.endDrag = this.endDrag.createDelegate(this); - this.dd.startDrag = this.startDrag.createDelegate(this); - this.dd.onDrag = this.onDrag.createDelegate(this); - - this.field.setRawValue(this.defaultValue); - }, - - onMouseOver: function(){ - if (this.disabled) { - return; - } - var middle = this.getMiddle(); - this.tmpHoverClass = (Ext.EventObject.getPageY() < middle) ? 'x-form-spinner-overup' : 'x-form-spinner-overdown'; - this.trigger.addClass(this.tmpHoverClass); - }, - - //private - onMouseOut: function(){ - this.trigger.removeClass(this.tmpHoverClass); - }, - - //private - onMouseMove: function(){ - if (this.disabled) { - return; - } - var middle = this.getMiddle(); - if (((Ext.EventObject.getPageY() > middle) && this.tmpHoverClass == "x-form-spinner-overup") || - ((Ext.EventObject.getPageY() < middle) && this.tmpHoverClass == "x-form-spinner-overdown")) { - } - }, - - //private - onMouseDown: function(){ - if (this.disabled) { - return; - } - var middle = this.getMiddle(); - this.tmpClickClass = (Ext.EventObject.getPageY() < middle) ? 'x-form-spinner-clickup' : 'x-form-spinner-clickdown'; - this.trigger.addClass(this.tmpClickClass); - }, - - //private - onMouseUp: function(){ - this.trigger.removeClass(this.tmpClickClass); - }, - - //private - onTriggerClick: function(){ - if (this.disabled || this.el.dom.readOnly) { - return; - } - var middle = this.getMiddle(); - var ud = (Ext.EventObject.getPageY() < middle) ? 'Up' : 'Down'; - this['onSpin' + ud](); - }, - - //private - getMiddle: function(){ - var t = this.trigger.getTop(); - var h = this.trigger.getHeight(); - var middle = t + (h / 2); - return middle; - }, - - //private - //checks if control is allowed to spin - isSpinnable: function(){ - if (this.disabled || this.el.dom.readOnly) { - Ext.EventObject.preventDefault(); //prevent scrolling when disabled/readonly - return false; - } - return true; - }, - - handleMouseWheel: function(e){ - //disable scrolling when not focused - if (this.wrap.hasClass('x-trigger-wrap-focus') == false) { - return; - } - - var delta = e.getWheelDelta(); - if (delta > 0) { - this.onSpinUp(); - e.stopEvent(); - } - else - if (delta < 0) { - this.onSpinDown(); - e.stopEvent(); - } - }, - - //private - startDrag: function(){ - this.proxy.show(); - this._previousY = Ext.fly(this.dd.getDragEl()).getTop(); - }, - - //private - endDrag: function(){ - this.proxy.hide(); - }, - - //private - onDrag: function(){ - if (this.disabled) { - return; - } - var y = Ext.fly(this.dd.getDragEl()).getTop(); - var ud = ''; - - if (this._previousY > y) { - ud = 'Up'; - } //up - if (this._previousY < y) { - ud = 'Down'; - } //down - if (ud != '') { - this['onSpin' + ud](); - } - - this._previousY = y; - }, - - //private - onSpinUp: function(){ - if (this.isSpinnable() == false) { - return; - } - if (Ext.EventObject.shiftKey == true) { - this.onSpinUpAlternate(); - return; - } - else { - this.spin(false, false); - } - this.field.fireEvent("spin", this); - this.field.fireEvent("spinup", this); - }, - - //private - onSpinDown: function(){ - if (this.isSpinnable() == false) { - return; - } - if (Ext.EventObject.shiftKey == true) { - this.onSpinDownAlternate(); - return; - } - else { - this.spin(true, false); - } - this.field.fireEvent("spin", this); - this.field.fireEvent("spindown", this); - }, - - //private - onSpinUpAlternate: function(){ - if (this.isSpinnable() == false) { - return; - } - this.spin(false, true); - this.field.fireEvent("spin", this); - this.field.fireEvent("spinup", this); - }, - - //private - onSpinDownAlternate: function(){ - if (this.isSpinnable() == false) { - return; - } - this.spin(true, true); - this.field.fireEvent("spin", this); - this.field.fireEvent("spindown", this); - }, - - spin: function(down, alternate){ - var v = parseFloat(this.field.getValue()); - var incr = (alternate == true) ? this.alternateIncrementValue : this.incrementValue; - (down == true) ? v -= incr : v += incr; - - v = (isNaN(v)) ? this.defaultValue : v; - v = this.fixBoundries(v); - this.field.setRawValue(v); - this.field.fireEvent("change", this, v) - }, - - fixBoundries: function(value){ - var v = value; - - if (this.field.minValue != undefined && v < this.field.minValue) { - v = this.field.minValue; - } - if (this.field.maxValue != undefined && v > this.field.maxValue) { - v = this.field.maxValue; - } - - return this.fixPrecision(v); - }, - - // private - fixPrecision: function(value){ - var nan = isNaN(value); - if (!this.field.allowDecimals || this.field.decimalPrecision == -1 || nan || !value) { - return nan ? '' : value; - } - return parseFloat(parseFloat(value).toFixed(this.field.decimalPrecision)); - }, - - doDestroy: function(){ - if (this.trigger) { - this.trigger.remove(); - } - if (this.wrap) { - this.wrap.remove(); - delete this.field.wrap; - } - - if (this.splitter) { - this.splitter.remove(); - } - - if (this.dd) { - this.dd.unreg(); - this.dd = null; - } - - if (this.proxy) { - this.proxy.remove(); - } - - if (this.repeater) { - this.repeater.purgeListeners(); - } - if (this.mimicing){ - Ext.get(Ext.isIE ? document.body : document).un("mousedown", this.mimicBlur, this); - } - } -}); diff --git a/src/script/spinner/SpinnerField.js b/src/script/spinner/SpinnerField.js deleted file mode 100644 index 234a7776..00000000 --- a/src/script/spinner/SpinnerField.js +++ /dev/null @@ -1,74 +0,0 @@ -/* - This file is part of Ext JS 3.4 - - Copyright (c) 2011-2013 Sencha Inc - - Contact: http://www.sencha.com/contact - - GNU General Public License Usage - This file may be used under the terms of the GNU General Public License version 3.0 as - published by the Free Software Foundation and appearing in the file LICENSE included in the - packaging of this file. - - Please review the following information to ensure the GNU General Public License version 3.0 - requirements will be met: http://www.gnu.org/copyleft/gpl.html. - - If you are unsure which license is appropriate for your use, please contact the sales department - at http://www.sencha.com/contact. - - Build date: 2013-04-03 15:07:25 - */ - -Ext.ns('Ext.ux.form'); - -/** - * @class Ext.ux.form.SpinnerField - * @extends Ext.form.NumberField - * Creates a field utilizing Ext.ux.Spinner - * @xtype spinnerfield - */ -Ext.ux.form.SpinnerField = Ext.extend(Ext.form.NumberField, { - actionMode: 'wrap', - deferHeight: true, - autoSize: Ext.emptyFn, - //onBlur: Ext.emptyFn, - adjustSize: Ext.BoxComponent.prototype.adjustSize, - - constructor: function(config) { - var spinnerConfig = Ext.copyTo({}, config, 'incrementValue,alternateIncrementValue,accelerate,defaultValue,triggerClass,splitterClass'); - - var spl = this.spinner = new Ext.ux.Spinner(spinnerConfig); - - var plugins = config.plugins - ? (Ext.isArray(config.plugins) - ? config.plugins.push(spl) - : [config.plugins, spl]) - : spl; - - Ext.ux.form.SpinnerField.superclass.constructor.call(this, Ext.apply(config, {plugins: plugins})); - }, - - // private - getResizeEl: function(){ - return this.wrap; - }, - - // private - getPositionEl: function(){ - return this.wrap; - }, - - // private - alignErrorIcon: function(){ - if (this.wrap) { - this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]); - } - }, - - validateBlur: function(){ - return true; - } -}); - -Ext.reg('spinnerfield', Ext.ux.form.SpinnerField); - diff --git a/src/script/widgets/ClassificationPanel.js b/src/script/widgets/ClassificationPanel.js index d93d8313..ee01e105 100644 --- a/src/script/widgets/ClassificationPanel.js +++ b/src/script/widgets/ClassificationPanel.js @@ -6,14 +6,34 @@ * of the license. */ + +/** + * @require OpenLayers/Renderer.js + * @require + */ + + +/** api: (define) + * module = gxp + * class = ClassificationPanel + * base_link = `Ext.TabPanel `_ + */ Ext.namespace("gxp"); + +/** api: constructor + * .. class:: ClassificationPanel(config) + * + * Create a dialog for generating a classified styling for a layer, + * with options for specifying the number of classes, + * classification method, and choice of color ramps. + */ gxp.ClassificationPanel = Ext.extend(Ext.Panel, { hidden: false, rulePanel: null, - + classNumberText: 'Classes', classifyText: "Classify", rampBlueText: "Blue", rampRedText: "Red", @@ -25,10 +45,13 @@ gxp.ClassificationPanel = Ext.extend(Ext.Panel, { selectColorText: "Select colors", colorStartText: "Start Color", colorEndText: "End Color", + colorRampText: 'Color Ramp', + methodText: "Method", methodUniqueText: "Unique Values", methodQuantileText: "Quantile", methodEqualText: "Equal Intervals", methodJenksText: "Jenks Natural Breaks", + selectMethodText: "Select method", standardDeviationText: "Standard Deviations", attributeText: "Attribute", selectAttributeText: "Select attribute", @@ -66,7 +89,6 @@ gxp.ClassificationPanel = Ext.extend(Ext.Panel, { listeners: { valid: function(field) { this.rulePanel.rule[field.name] = field.getValue(); - //this.rulePanel.fireEvent("change", this.rulePanel, this.rulePanel.rule); }, scope: this } @@ -82,20 +104,15 @@ gxp.ClassificationPanel = Ext.extend(Ext.Panel, { listeners: { valid: function(field) { this.rulePanel.rule[field.name] = field.getValue(); - //this.rulePanel.fireEvent("change", this.rulePanel, this.rulePanel.rule); }, scope: this - }, - scope: this + } } - ] }); - - var classNumSelector = new Ext.ux.form.SpinnerField({ - fieldLabel: 'Classes', + fieldLabel: this.classNumberText, id: "choropleth_classes", minValue: 2, name: 'intervals', @@ -103,19 +120,18 @@ gxp.ClassificationPanel = Ext.extend(Ext.Panel, { width: 110, listeners: { 'change':function(spinner, value){ - this.rulePanel.rule['intervals'] = value; - //this.rulePanel.fireEvent("change", this.rulePanel, this.rulePanel.rule); + this.rulePanel.rule[classNumSelector.name] = value; }, scope: this } }); - this.rulePanel.rule["intervals"] = classNumSelector.defaultValue; + this.rulePanel.rule[classNumSelector.name] = classNumSelector.defaultValue; var colorDropdown = new Ext.form.ComboBox({ id: 'choropleth_colorramp', name: 'ramp', - fieldLabel: 'Color Ramp', + fieldLabel: this.colorRampText, store: new Ext.data.ArrayStore({ id: 0, fields: [ @@ -148,25 +164,19 @@ gxp.ClassificationPanel = Ext.extend(Ext.Panel, { case "Blue": this.rulePanel.rule["color_start"] = "#f7fbff"; this.rulePanel.rule["color_end"] = "#08306b"; - //this.rulePanel.rule["color_mid"] = "#fd8d3c"; this.rulePanel.rule[cmb.name] = "Custom"; break; case "Red": this.rulePanel.rule["color_start"] = "#fff5f0"; this.rulePanel.rule["color_end"] = "#67000d"; - //this.rulePanel.rule["color_mid"] = ""; this.rulePanel.rule[cmb.name] = "Custom"; break; case "Orange": this.rulePanel.rule["color_start"] = "#fff5eb"; this.rulePanel.rule["color_end"] = "#f16913"; - //this.rulePanel.rule["color_mid"] = ""; this.rulePanel.rule[cmb.name] = "Custom"; break; case "Jet": - //this.rulePanel.rule["color_start"] = "#5e4fa2"; - //this.rulePanel.rule["color_end"] = "#9e0142"; - //this.rulePanel.rule["color_mid"] = "#ffffbf"; this.rulePanel.rule[cmb.name] = "Jet"; break; default: @@ -179,11 +189,10 @@ gxp.ClassificationPanel = Ext.extend(Ext.Panel, { } }); - var methodDropdown = new Ext.form.ComboBox({ id: 'choropleth_method', name: 'method', - fieldLabel: 'Method', + fieldLabel: this.methodText, store: new Ext.data.ArrayStore({ id: 0, mode: 'local', @@ -204,7 +213,7 @@ gxp.ClassificationPanel = Ext.extend(Ext.Panel, { mode: 'local', width: 110, editable: false, - emptyText: 'Select method', + emptyText: this.selectMethodText, triggerAction: 'all', disabled: false, listeners: { @@ -213,8 +222,6 @@ gxp.ClassificationPanel = Ext.extend(Ext.Panel, { //If uniqueInterval: disable # classes classNumSelector.setDisabled(cmb.value == "uniqueInterval"); this.rulePanel.rule[cmb.name] = cmb.value; - //this.rulePanel.fireEvent("change", this.rulePanel, this.rulePanel.rule); - }, scope: this } @@ -236,14 +243,11 @@ gxp.ClassificationPanel = Ext.extend(Ext.Panel, { listeners: { 'select': function(cmb, data, idx) { this.rulePanel.rule[cmb.name] = cmb.value; - - methodDropdown.clearValue(); var methodStore = methodDropdown.getStore(); - for (var i = 0; i < methodStore.data.length; i++) { + for (var i = 0, ii=methodStore.data.length; i . */ modifyScaleTipContext: Ext.emptyFn, - + + /** private: property[classifyEnabled] + * ``Boolean`` Enable the ClassificationPanel widget + * Default is false. + */ + classifyEnabled: false, + /** i18n */ labelFeaturesText: "Label Features", labelsText: "Labels", diff --git a/src/script/widgets/WMSStylesDialog.js b/src/script/widgets/WMSStylesDialog.js index 40470e25..c359e721 100644 --- a/src/script/widgets/WMSStylesDialog.js +++ b/src/script/widgets/WMSStylesDialog.js @@ -18,6 +18,7 @@ * @require GeoExt/data/AttributeStore.js * @require GeoExt/widgets/WMSLegend.js * @require GeoExt/widgets/VectorLegend.js + * @require OpenLayers/Format/Filter/v1_1_0.js */ @@ -406,8 +407,7 @@ gxp.WMSStylesDialog = Ext.extend(Ext.Container, { iconCls: "save", handler: function() { styleProperties.destroy(); - }, - scope: this + } }] }; var styleProperties = new this.dialogCls(Ext.apply(buttonCfg, { @@ -440,11 +440,21 @@ gxp.WMSStylesDialog = Ext.extend(Ext.Container, { })); this.showDlg(styleProperties); }, - + + getAttributeStore: function() { + return new GeoExt.data.AttributeStore({ + url: this.layerDescription.owsURL, + baseParams: { + "SERVICE": this.layerDescription.owsType, + "REQUEST": "DescribeFeatureType", + "TYPENAME": this.layerDescription.typeName + }, + method: "GET", + disableCaching: false + }); + }, /** api: method[classifyStyleRules] - * :arg prevStyle: ``Ext.data.Record`` - * * Edit the currently selected style with classification options enabled. */ classifyStyleRules:function () { @@ -452,7 +462,7 @@ gxp.WMSStylesDialog = Ext.extend(Ext.Container, { var rule = userStyle.rules[0]; var origRules = []; - for (var i=0; i < userStyle.rules.length; i++){ + for (var i= 0, ii = userStyle.rules.length; i < ii; i++){ origRules[i] = userStyle.rules[i].clone(); } @@ -471,16 +481,7 @@ gxp.WMSStylesDialog = Ext.extend(Ext.Container, { rule: rule, fonts:this.fonts, classifyEnabled: true, - attributes: new GeoExt.data.AttributeStore({ - url: this.layerDescription.owsURL, - baseParams: { - "SERVICE": this.layerDescription.owsType, - "REQUEST": "DescribeFeatureType", - "TYPENAME": this.layerDescription.typeName - }, - method: "GET", - disableCaching: false - }), + attributes: this.getAttributeStore(), autoScroll: true, border: false, defaults: { @@ -708,16 +709,7 @@ gxp.WMSStylesDialog = Ext.extend(Ext.Container, { ref: "rulePanel", symbolType: this.symbolType, rule: rule, - attributes: new GeoExt.data.AttributeStore({ - url: this.layerDescription.owsURL, - baseParams: { - "SERVICE": this.layerDescription.owsType, - "REQUEST": "DescribeFeatureType", - "TYPENAME": this.layerDescription.typeName - }, - method: "GET", - disableCaching: false - }), + attributes: this.getAttributeStore(), autoScroll: true, border: false, defaults: { @@ -787,7 +779,7 @@ gxp.WMSStylesDialog = Ext.extend(Ext.Container, { var xmlParser = new OpenLayers.Format.XML(); var xmlRules = xmlParser.getElementsByTagNameNS(xmlParser.read(result.responseText).documentElement, "*", "Rule"); - for (var i = 0; i < xmlRules.length; i++) { + for (var i = 0, ii = xmlRules.length; i < ii; i++) { var new_rule = rule.clone(); var ruleTitle = xmlParser.getElementsByTagNameNS(xmlRules[i], "*", "Title")[0]; new_rule.title = ruleTitle.textContent || ruleTitle.text; @@ -1105,13 +1097,7 @@ gxp.WMSStylesDialog = Ext.extend(Ext.Container, { } var layer = this.layerRecord.getLayer(); - var url = this.layerRecord.get("restUrl"); - if (!url) { - url = layerRecord.get("restUrl"); - } - if (!url) { - url = layer.url.split("?").shift().replace(/\/(wms|ows)\/?$/, "/rest"); - } + var url = this.getLayerRestUrl(this.layerRecord); Ext.Ajax.request({ url: url + "/sldservice/" + layer.params["LAYERS"] + "/attributes.xml", @@ -1382,7 +1368,24 @@ gxp.WMSStylesDialog = Ext.extend(Ext.Container, { */ showDlg: function(dlg) { dlg.show(); + }, + + /** private: method[getLayerRestUrl] + * :arg layerRecord ``Object`` + * :arg url ``String`` + * :return: ``String`` the layer's REST URL + */ + getLayerRestUrl: function(layerRecord, url) { + if (!url) { + url = layerRecord.get("restUrl"); + } + if (!url) { + var layer = layerRecord.getLayer(); + url = layer.url.split("?").shift().replace(/\/(wms|ows)\/?$/, "/rest"); + } + return url; } + }); @@ -1399,12 +1402,7 @@ gxp.WMSStylesDialog = Ext.extend(Ext.Container, { */ gxp.WMSStylesDialog.createGeoServerStylerConfig = function(layerRecord, url) { var layer = layerRecord.getLayer(); - if (!url) { - url = layerRecord.get("restUrl"); - } - if (!url) { - url = layer.url.split("?").shift().replace(/\/(wms|ows)\/?$/, "/rest"); - } + url = this.prototype.getLayerRestUrl(layerRecord, url); return { xtype: "gxp_wmsstylesdialog", layerRecord: layerRecord, diff --git a/src/theme/all.css b/src/theme/all.css index 9ce80f14..2320c09a 100644 --- a/src/theme/all.css +++ b/src/theme/all.css @@ -605,48 +605,6 @@ div.olMap div.gx-overlay-playback { .thumb-mapbox-world-print { background-image:url('img/thumbs/mapbox/world-print.png'); } -.x-form-spinner-proxy{ - /*background-color:#ff00cc;*/ -} -.x-form-field-wrap .x-form-spinner-trigger { - background:transparent url('img/spinner.gif') no-repeat 0 0; - right: 0px; -} -.x-form-field-wrap .x-form-spinner-overup{ - background-position:-17px 0; -} -.x-form-field-wrap .x-form-spinner-clickup{ - background-position:-34px 0; -} -.x-form-field-wrap .x-form-spinner-overdown{ - background-position:-51px 0; -} -.x-form-field-wrap .x-form-spinner-clickdown{ - background-position:-68px 0; -} -.x-trigger-wrap-focus .x-form-spinner-trigger{ - background-position:-85px 0; -} -.x-trigger-wrap-focus .x-form-spinner-overup{ - background-position:-102px 0; -} -.x-trigger-wrap-focus .x-form-spinner-clickup{ - background-position:-119px 0; -} -.x-trigger-wrap-focus .x-form-spinner-overdown{ - background-position:-136px 0; -} -.x-trigger-wrap-focus .x-form-spinner-clickdown{ - background-position:-153px 0; -} -.x-trigger-wrap-focus .x-form-trigger{ - border-bottom: 1px solid #7eadd9; -} -.x-form-field-wrap .x-form-spinner-splitter { -} -.x-trigger-wrap-focus .x-form-spinner-splitter{ - background-position:-14px 0; -} .x-btn .gradient { background-image: url(img/gradient.png); } diff --git a/src/theme/img/spinner.gif b/src/theme/img/spinner.gif deleted file mode 100644 index 4e72f53d09fe7b105bf33fe75b61370e034e60d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3186 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