r1078 - in trunk: . src/main/java/org/ourproject/kune/app/public/css src/main/java/org/ourproject/kune/chat/client src/main/java/org/ourproject/kune/platf/client src/main/java/org/ourproject/kune/platf/client/actions src/main/java/org/ourproject/kune/platf/client/actions/toolbar src/main/java/org/ourproject/kune/platf/client/services src/main/java/org/ourproject/kune/platf/client/shortcuts src/main/java/org/ourproject/kune/platf/client/ui src/main/java/org/ourproject/kune/platf/client/ui/dial
Author: vjrj Date: 2009-03-16 05:13:36 +0100 (Mon, 16 Mar 2009) New Revision: 1078 Added: trunk/src/main/java/org/ourproject/kune/platf/client/shortcuts/ trunk/src/main/java/org/ourproject/kune/platf/client/shortcuts/ActionShortcut.java trunk/src/main/java/org/ourproject/kune/platf/client/shortcuts/ActionShortcutRegister.java trunk/src/main/java/org/ourproject/kune/platf/client/shortcuts/GlobalShortcutRegister.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalette.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalettePanel.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalettePresenter.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPaletteView.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalette.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalettePanel.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalettePresenter.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePaletteView.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/film.png trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/AbstractRichTextAreaTest.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/AbstractWysiwygClientTest.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialog.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogPanel.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogPresenter.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogView.java Removed: trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcut.java trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcutRegister.java trunk/src/main/java/org/ourproject/kune/workspace/client/events/GlobalShortcutRegister.java Modified: trunk/TODO trunk/src/main/java/org/ourproject/kune/app/public/css/all.css trunk/src/main/java/org/ourproject/kune/app/public/css/docs.css trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java trunk/src/main/java/org/ourproject/kune/chat/client/ChatEngineDefault.java trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionDescriptor.java trunk/src/main/java/org/ourproject/kune/platf/client/actions/toolbar/ActionToolbarButton.java trunk/src/main/java/org/ourproject/kune/platf/client/services/PlatformModule.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/TextUtils.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/dialogs/DefaultForm.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalette.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalettePanel.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalettePresenter.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePaletteView.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/RichTextArea.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/basic/RTEditorPanel.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/basic/RTEditorPresenter.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/RTEImgResources.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/rteimg.css trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/LinkInfoTest.java trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/saving/RTESavingEditorPresenter.java trunk/src/main/java/org/ourproject/kune/workspace/client/AbstractFoldableContentActions.java trunk/src/main/java/org/ourproject/kune/workspace/client/WorkspaceModule.java trunk/src/main/java/org/ourproject/kune/workspace/client/hello/HelloWorldModule.java trunk/src/test/java/org/ourproject/kune/platf/client/actions/ActionShortcutTest.java Log: Complete - task Insert Table Dialog Complete - task Better RTE (Rich Text Editor) support Modified: trunk/TODO =================================================================== --- trunk/TODO 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/TODO 2009-03-16 04:13:36 UTC (rev 1078) @@ -10,6 +10,45 @@ Use org-mode in emacs to easy manage this file * SHORT-TERM (URGENT) +** vjrj use xwiki maven repo + http://maven.xwiki.org/releases/com/xpn/xwiki/platform/xwiki-web-wysiwyg/1.8... +** vjrj <v> better RTE +*** Pending +**** W3C Range/Selection support in RTE + https://developer.mozilla.org/en/DOM/selection + http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html + As an intro: + http://www.quirksmode.org/dom/range_intro.html + http://maven.xwiki.org/site/xwiki-web/xwiki-web-wysiwyg/apidocs/com/xpn/xwik... + other links: + http://groups.google.com/group/rocket-gwt/browse_frm/thread/e56540d4168479c0... + http://code.google.com/p/gwt-html-editor/source/browse/branches/gwt1.4/src/c... +**** Insert/Edit link +***** use cases + ^<a href="http://example.com">sample</a>^ --- Parse and edit + <a href="http://example.com">s^ample</a> --- Parse and edit + <a href="http://example.com">s^amp^le</a> --- Parse and edit + ^some text <a href="http://example.com">samp^le</a> --- new link with get inner content? +**** Quite urgent: Shortcuts propagation to browser + http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user... + http://openkm.cvs.sourceforge.net/viewvc/openkm/openkm/src/es/git/openkm/fro... + http://openkm.cvs.sourceforge.net/viewvc/openkm/openkm/src/es/git/openkm/fro... + http://whatwouldnickdo.com/wordpress/370/gwt-right-click-context-menu/ +**** with different menus (File/Blog ...) +**** bidi support +**** Insert special chars (for table or from unicode). +**** images (local/remote) with preview +**** youtube videos/podcasts +**** Edit HTML +**** File > Rename (F2) +**** Insert > Special char +**** Insert > Page break (for printing) +**** Shortcut to fonts (Ctrl + numbers) +*** Links + http://www.ongwt.com/post/2009/01/08/XWiki-:-Wysiwyg-editor-based-on-GWT + http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/int... + http://www.mozilla.org/editor/midas-spec.html + http://mozilla.org/editor/midasdemo/ ** vjrj <v> GWT 1.6 http://groups.google.com/group/Google-Web-Toolkit/browse_thread/thread/3e7e6... http://code.google.com/p/google-web-toolkit/wiki/WAR_Design_1_6 @@ -77,43 +116,6 @@ http://code.google.com/p/google-web-toolkit-doc-1-5/wiki/DevGuideHistory http://en.wikipedia.org/wiki/Fragment_identifier http://www.w3.org/DesignIssues/Fragment.html -** vjrj <v> better RTE -*** Pending -**** W3C Range/Selection support in RTE - https://developer.mozilla.org/en/DOM/selection - http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html - As an intro: - http://www.quirksmode.org/dom/range_intro.html - http://maven.xwiki.org/site/xwiki-web/xwiki-web-wysiwyg/apidocs/com/xpn/xwik... - other links: - http://groups.google.com/group/rocket-gwt/browse_frm/thread/e56540d4168479c0... - http://code.google.com/p/gwt-html-editor/source/browse/branches/gwt1.4/src/c... -**** Insert/Edit link -***** use cases - ^<a href="http://example.com">sample</a>^ --- Parse and edit - <a href="http://example.com">s^ample</a> --- Parse and edit - <a href="http://example.com">s^amp^le</a> --- Parse and edit - ^some text <a href="http://example.com">samp^le</a> --- new link with get inner content? -**** Quite urgent: Shortcuts propagation to browser - http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/user... - http://openkm.cvs.sourceforge.net/viewvc/openkm/openkm/src/es/git/openkm/fro... - http://openkm.cvs.sourceforge.net/viewvc/openkm/openkm/src/es/git/openkm/fro... - http://whatwouldnickdo.com/wordpress/370/gwt-right-click-context-menu/ -**** with different menus (File/Blog ...) -**** bidi support -**** Insert special chars (for table or from unicode). -**** images (local/remote) with preview -**** youtube videos/podcasts -**** Edit HTML -**** File > Rename (F2) -**** Insert > Special char -**** Insert > Page break (for printing) -**** Shortcut to fonts (Ctrl + numbers) -*** Links - http://www.ongwt.com/post/2009/01/08/XWiki-:-Wysiwyg-editor-based-on-GWT - http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/int... - http://www.mozilla.org/editor/midas-spec.html - http://mozilla.org/editor/midasdemo/ ** vjrj <v> rails group-shortname.kune-site-domain/tool-name/folder-id/doc-id routing, maybe use: http://agilewebdevelopment.com/plugins/request_routing http://wiki.rubyonrails.org/rails/pages/Request+Routing Modified: trunk/src/main/java/org/ourproject/kune/app/public/css/all.css =================================================================== --- trunk/src/main/java/org/ourproject/kune/app/public/css/all.css 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/app/public/css/all.css 2009-03-16 04:13:36 UTC (rev 1078) @@ -35,7 +35,7 @@ } */.kune-NavigationBar .topBar .gwt-Image{margin:0 2px 0 5px;}.kune-NavigationBar .Items{margin:2px 0;}.kune-NavigationBar .Items .gwt-Image{margin:2px 0;vertical-align:middle;}.kune-NavigationBar .Items .gwt-Hyperlink a{color:green;/* FIXME: other color */}.kune-NavigationBar .topBar .topBar-margin{margin-left:5px;}.kune-NavigationBar .pathMenu{vertical-align:middle;}.kune-NavigationBar .pathMenu .gwt-MenuItem{background:transparent url(img/button-bg-hard.gif) repeat-x 0 0;border-left:1px solid #AAA;border-right:1px solid #AAA;color:#999;cursor:pointer;white-space:nowrap;padding:3px 6px;}.kune-NavigationBar .pathMenu .gwt-MenuItem-selected{background:transparent url(img/button-bg-soft.gif) repeat-x 0 0;color:#000;}.kune-NavigationBar .kune-IconHyperlink{vertical-align:middle;margin-left:5px;}.kune-NavigationBar .kune-IconHyperlink a{color:green;text-decoration:none;}.kune-NavigationBar .kune-IconHyperlink .gwt-Image{margin-right:3px;vertical-align:middle;}/* Social Network */.kune-StackedDropDownPanel{}.kune-StackedDropDownPanel .gwt-StackPanelItem{border-top:1px solid #CCC;border-bottom:1px solid #CCC;background-color:#EFA;cursor:pointer;padding:1px 3px 0 6px;overflow:hidden;}.kune-StackedDropDownPanel .gwt-StackPanelItem img{margin:0 0 0 3px;vertical-align:middle;}.kune-StackedDropDownPanel .kune-DropDownInner table{width:100%;}.kune-StackedDropDownPanel .gwt-StackPanelItem-selected{}.kune-StackedDropDownPanelLink{background-color:#E6E6E6;border-top:1px solid #CCC;border-bottom:1px solid #F2F2F2;/* white-space: nowrap; */cursor:pointer;}.kune-StackedDropDownPanel .kune-DropDownInner{padding:0;}/* StackedDropDownPanel Members */.kune-StackSubItemLabel{overflow:hidden;}.kune-StackSubItemLabel .gwt-MenuItem{white-space:nowrap;cursor:pointer;border-bottom:1px solid #F2F2F2;}.kune-StackSubItemLabel table{width:100%;}.kune-StackSubItemLabel .gwt-MenuItem img{vertical-align:middle;margin-top:1px;margin-bottom:1px;margin-left:5px;margin-right:3px;}.kune-StackSubItemLabel .gwt-MenuItem-selected{background-color:#FFE6D5;}.kune-StackSubItemActions{background-color:#F2F2F2;border:1px solid #999;vertical-align:middle;padding:5px 0;margin-left:-120px;margin-top:-2px;}.kune-StackSubItemActions .gwt-MenuItem{cursor:pointer;padding:1px 10px;white-space:nowrap;}.kune-StackSubItemActions .gwt-MenuItem img{vertical-align:middle;margin-right:3px;}.kune-StackSubItemActions .gwt-MenuItem-selected{background-color:#FFB958;}/* AccessList */.kune-AccessListSubLabel{font-style:italic;}.kune-AccessList{margin:5px;width:100%;}.kune-AccessList .gwt-DisclosurePanel{margin:5px;width:100%;}.kune-AccessList .gwt-DisclosurePanel-open{width:100%;}.kune-AccessList .gwt-DisclosurePanel-closed{width:100%;}.kune-AccessList .header{margin:0 0 3px;text-decoration:none;width:100%;background-color:#8DD35F;}.kune-AccessList .header table{margin:0 5px 0 0;width:100%;color:#FFF;}.kune-AccessList .header img{margin:0 3px 0 0;}.kune-AccessList .content{margin:0 0 0 7px;width:100%;}.kune-AccessList .content table{margin-bottom:5px;width:100%;}/* Rate */.kune-RatePanel-Label{white-space:nowrap;vertical-align:middle;}.kune-RatePanel-Stars{margin-left:5px;vertical-align:middle;}.kune-RatePanel-Stars-RateIt{cursor:pointer;}/* Licenses */.kune-License-CC-Header{color:#15428B;font-weight:700;font-size:85%;margin-top:5px;}.kune-License-CC-Header .gwt-Label{color:#15428B;font-weight:700;font-size:85%;margin-top:5px;}/* Theme */.kune-IconBottomPanel .gwt-MenuItem{cursor:pointer;background-color:#FFF;margin:2px 2px 2px 5px;}.kune-IconBottomPanel .gwt-MenuItem-selected{background-color:#F2F2F2;}.gwt-MenuBar-bottomMenu{margin-left:-60px;margin-top:-120px;}/* i18n */.kune-I18nTranslatorCell{white-space:normal;}.kune-i18nTranslator-recommend{margin:10px;}.kune-i18nTranslator-recommend h1{font-size:131%;font-weight:700;}.kune-i18nTranslator-recommend h2{font-size:116%;font-weight:700;}.kune-i18nTranslator-recommend h3{font-size:108%;font-weight:700;font-style:italic;}.kune-i18nTranslator-recommend em{font-weight:700;}.kune-i18nTranslator-recommend strong{font-weight:700;}/* Admin Context */.kune-AdminContextPanel{margin:6px;width:100%;}.kune-AdminContextPanel .gwt-StackPanelItem{background:transparent url(img/arrow-right-white.gif) no-repeat scroll 3px 2px;cursor:pointer;padding:3px 10px 1px 20px;overflow:hidden;width:100%;}.kune-AdminContextPanel .gwt-StackPanelItem img{margin:0 0 0 3px;vertical-align:middle;}.kune-AdminContextPanel .gwt-StackPanelItem-selected{background:transparent url(img/arrow-down-white.gif) no-repeat scroll 3px 2px;background-color:#DEE3DB;}.kune-AdminContextPanelLink{background-color:#E6E6E6;border-top:1px solid #CCC;border-bottom:1px solid #F2F2F2;/* white-space: nowrap; */cursor:pointer;}.kune-AdminContextPanel-inner{background-color:#FFF;}.kune-AdminContextPanel-inner-wrap{margin:5px;}.kune-EditableLabel{}.kune-EditableLabel .kune-EditableLabel-editable{}.kune-EditableLabel-high{background-color:#FFFBC1;cursor:pointer;}.kune-EditableLabel-high span{background-color:#FFFBC1;}.kune-EditableLabel a{margin-left:5px;}.kune-EditableLabel a:link{color:green;}.kune-EditableLabel a:hover{text-decoration:underline;}.kune-EditableLabel a:visited{color:olive;}.kune-EditableLabel img{margin-right:4px;vertical-align:middle;}.kune-EditableLabel-editable img{margin-right:4px;vertical-align:middle;}.kune-EditableLabel-editable span{margin:3px;}.kune-EditableLabel span{margin:3px;}.kune-BottomIconsTrayPanel{width:165px;height:21px;vertical-align:middle;background-color:#EFEFEF;}.kune-Content-Main{margin:5px;}/* Yahoo ui base.css */.kune-Content-Main h1{font-size:138.5%;}.kune-Content-Main h2{font-size:123.099998%;}.kune-Content-Main h3{font-size:108%;}.kune-Content-Main h1{margin:1em 0;}.kune-Content-Main h2{margin:1em 0;}.kune-Content-Main h3{margin:1em 0;}.kune-Content-Main h1{font-weight:700;}.kune-Content-Main h2{font-weight:700;}.kune-Content-Main h3{font-weight:700;}.kune-Content-Main h4{font-weight:700;}.kune-Content-Main h5{font-weight:700;}.kune-Content-Main h6{font-weight:700;}.kune-Content-Main strong{font-weight:700;}.kune-Content-Main abbr{border-bottom:1px dotted #000;cursor:help;}.kune-Content-Main acronym{border-bottom:1px dotted #000;cursor:help;}.kune-Content-Main em{font-style:italic;}.kune-Content-Main blockquote{margin:1em;}.kune-Content-Main ul{margin:1em;}.kune-Content-Main ol{margin:1em;}.kune-Content-Main dl{margin:1em;}.kune-Content-Main ol{margin-left:2em;}.kune-Content-Main ul{margin-left:2em;}.kune-Content-Main dl{margin-left:2em;}.kune-Content-Main ol{list-style:decimal outside;}.kune-Content-Main li{list-style:decimal outside;}.kune-Content-Main li{list-style:disc outside;}.kune-Content-Main ul{list-style:disc outside;}.kune-Content-Main dl{margin-left:1em;}.kune-Content-Main dd{margin-left:1em;}.kune-Content-Main th{border:1px solid #000;padding:.5em;font-weight:700;text-align:center;}.kune-Content-Main td{border:1px solid #000;padding:.5em;}.kune-Content-Main caption{margin-bottom:.5em;text-align:center;}.kune-Content-Main p{margin-bottom:1em;}.kune-Content-Main fieldset{margin-bottom:1em;}.kune-Content-Main table{margin-bottom:1em;}.kune-Content-Main pre{margin-bottom:1em;}.kune-Content-Main input[type=text]{width:12.25em;width:11.9em;}.kune-Content-Main input[type=password]{width:12.25em;width:11.9em;}.kune-Content-Main textarea{width:12.25em;width:11.9em;}.search-icon{background-image:url(img/search.gif)!important;}.i18n-icon{background-image:url(img/language.gif)!important;}/* RTE Text editor */.kune-TexEditorPanel-TextArea{margin:3px;}.gwt-RichTextArea{/* border: 1px solid #000; background-color: #FFF; */border:1px solid #4D4D4D;background-color:#FFF;margin:5px 0 5px 10px;}.gwt-RichTextToolbar{/* background-color: #F2F2F2; - padding: 5px; */height:24px;vertical-align:middle;}.gwt-RichTextToolbar table{vertical-align:middle;}.gwt-RichTextToolbar .gwt-ToggleButton{float:left;margin-top:2px;}.gwt-RichTextToolbar .gwt-PushButton{float:left;margin-top:2px;}.gwt-RichTextToolbar .gwt-PushButton-up{margin-right:2px;border:1px solid #F2F2F2;}.gwt-RichTextToolbar .gwt-PushButton-up-hovering{margin-right:2px;border:1px solid #C3D9FF;border-color:#E8F1FF #9daecd #9daecd #e8f1ff;}.gwt-RichTextToolbar .gwt-PushButton-down{margin-right:2px;border:1px solid #C3D9FF;border-color:#9DAECD #e8f1ff #e8f1ff #9daecd;}.gwt-RichTextToolbar .gwt-PushButton-down-hovering{margin-right:2px;border:1px solid #C3D9FF;border-color:#9DAECD #e8f1ff #e8f1ff #9daecd;}.gwt-RichTextToolbar .gwt-ToggleButton-up{margin-right:2px;border:1px solid #F2F2F2;}.gwt-RichTextToolbar .gwt-ToggleButton-up-hovering{margin-right:2px;border:1px solid #C3D9FF;border-color:#E8F1FF #9daecd #9daecd #e8f1ff;}.gwt-RichTextToolbar .gwt-ToggleButton-down{margin-right:2px;background-color:#E8F1FF;border:1px solid #C3D9FF;border-color:#9DAECD #e8f1ff #e8f1ff #9daecd;}.gwt-RichTextToolbar .gwt-ToggleButton-down-hovering{margin-right:2px;background-color:#E8F1FF;border:1px solid #C3D9FF;border-color:#9DAECD #e8f1ff #e8f1ff #9daecd;}.gwt-RichTextToolbar .x-btn{float:left;}.gwt-RichTextToolbar .kune-Button-Large-lSpace{float:left;}.gwt-RichTextToolbar .kune-Button-Large-lrSpace{float:left;}.RichTextToolbar-menu{float:left;margin-top:2px;z-index:4;}.RichTextToolbar-menu table{border-collapse:collapse;border-spacing:0;margin:0;z-index:4;}.RichTextToolbar-menu .gwt-MenuItem{margin-right:2px;border:1px solid #F2F2F2;}.RichTextToolbar-menu .gwt-MenuItem-selected{margin-right:2px;background-color:#E8F1FF;border:1px solid #C3D9FF;border-color:#9DAECD #e8f1ff #e8f1ff #9daecd;}.RichTextToolbar-submenu{background-color:#FFFCD5;border:1px solid #D38D5F;cursor:default;z-index:4;}.RichTextToolbar-submenu .gwt-MenuItem{cursor:default;white-space:nowrap;border:1px solid #FFFCD5;padding:0 4px;}.RichTextToolbar-submenu .gwt-MenuItem-selected{background-color:#FFB958;border:1px solid #C83737;}.kune-WebSafePalette{background-color:#FFF;border:1px solid #AAA;margin:1px;}.kune-WebSafePalette-popup{z-index:9999!important;}.kune-WebSafePalette td{width:12px;height:10px;}.k-site-traybar{background:#FFF none repeat scroll 0 50%;}.k-blank-toolbar{background:#FFF none repeat scroll 0 50%;}.k-sitebar .kune-IconHyperlink{white-space:nowrap;}.k-sitebar .kune-IconHyperlink a:link{cursor:pointer;text-decoration:underline;color:#B3B3B3;}.k-sitebar .kune-IconHyperlink a:hover{text-decoration:underline;}.k-sitebar .kune-IconHyperlink a:visited{color:#B3B3B3;}.k-sitebar-labellink{white-space:nowrap;color:#B3B3B3;cursor:pointer;text-decoration:underline;}.k-sitebar{margin-right:10px;height:16px;background:#FFF;}.k-sitebar .gwt-TextBox{border:1px solid #E4A374;margin:0 15px 0 3px;padding-left:1px;color:#B3B3B3;}.k-sitebar .gwt-Hyperlink a{white-space:nowrap;color:#B3B3B3;text-decoration:underline;cursor:pointer;}.k-sitebar .gwt-PushButton{cursor:pointer;}.k-sitebar-LabelLink{white-space:nowrap;color:#B3B3B3;cursor:pointer;text-decoration:underline;}.k-entity-summary{border-left-color:#FFF;border-left-width:5px;border-bottom-color:#FFF;border-bottom-width:5px;}.k-entitytextlogo-border{border:2px solid #F2F2F2;}.k-entitytextlogo-no-border{border:none;}.k-entitytextlogo{height:60px;margin:0 0 4px;overflow:hidden;width:468px;}.k-entitytextlogo table{vertical-align:middle;}.k-elogo-l-l{font-size:272%;}.k-elogo-l-m{font-size:167%;}.k-elogo-l-s{font-size:108%;}.k-entitytextlogo .gwt-Label{font-weight:700;margin:5px;height:27px;}.k-entitytextlogo-default .gwt-Label{color:#69312F;}.k-entitytextlogo-green .gwt-Label{color:#250;}.k-entitytextlogo-blue .gwt-Label{color:navy;}.k-entitytextlogo-grey .gwt-Label{color:#1A1A1A;}.k-entitytextlogo-purple .gwt-Label{color:#405;}.k-entitytextlogo-red .gwt-Label{color:maroon;}.k-elogo-plink{color:#CCC;font-size:85%;margin:5px;text-decoration:underline;white-space:nowrap;background-color:#FFF;}.k-elogop-expand{background-color:transparent;}.k-entity-default .x-layout-split,.k-entity-default .x-layout-collapsed{background:#DD8A3D none repeat scroll 0 50%;}.k-entity-green .x-layout-split,.k-entity-green .x-layout-collapsed{background:#5FD35F none repeat scroll 0 50%;}.k-entity-blue .x-layout-split,.k-entity-blue .x-layout-collapsed{background:#06F none repeat scroll 0 50%;}.k-entity-grey .x-layout-split,.k-entity-grey .x-layout-collapsed{background:#4D4D4D none repeat scroll 0 50%;}.k-entity-purple .x-layout-split,.k-entity-purple .x-layout-collapsed{background:#660080 none repeat scroll 0 50%;}.k-entity-red .x-layout-split,.k-entity-red .x-layout-collapsed{background:#D40000 none repeat scroll 0 50%;}.k-entityworkspace .x-layout-split,.k-entityworkspace .x-layout-collapsed{background:transparent none repeat scroll 0 50%;}.k-entityworkspace-default .x-layout-split,.k-entityworkspace-default .x-layout-collapsed{background:#DEAA87 none repeat scroll 0 50%;}.k-entityworkspace-green .x-layout-split,.k-entityworkspace-green .x-layout-collapsed{background:#DCE8AB none repeat scroll 0 50%;}.k-entityworkspace-blue .x-layout-split,.k-entityworkspace-blue .x-layout-collapsed{background:#D5D5FF none repeat scroll 0 50%;}.k-entityworkspace-grey .x-layout-split,.k-entityworkspace-grey .x-layout-collapsed{background:#999 none repeat scroll 0 50%;}.k-entityworkspace-purple .x-layout-split,.k-entityworkspace-purple .x-layout-collapsed{background:#A793AC none repeat scroll 0 50%;}.k-entityworkspace-red .x-layout-split,.k-entityworkspace-red .x-layout-collapsed{background:#F55 none repeat scroll 0 50%;}.k-entity-title{border-left-style:solid;border-left-width:2px;}.k-entity-title div{line-height:22px;white-space:nowrap;}.k-entity-subtitle{}.k-entity-subtitle div{line-height:22px;white-space:nowrap;}.k-entity-title-rd-default{background:#DD8A3D;}.k-entity-title-rd-green{background:#5FD35F;}.k-entity-title-rd-blue{background:#06F;}.k-entity-title-rd-grey{background:#4D4D4D;}.k-entity-title-rd-purple{background:#660080;}.k-entity-title-rd-red{background:#D40000;}.k-entity-title-default{background:#F1BB59 none repeat scroll 0 50%;border-left-color:#DD8A3D;}.k-entity-title-green{background:#AFA none repeat scroll 0 50%;border-left-color:#5FD35F;}.k-entity-title-blue{background:#AFDDE9 none repeat scroll 0 50%;border-left-color:#06F;}.k-entity-title-grey{background:#CCC none repeat scroll 0 50%;border-left-color:#4D4D4D;}.k-entity-title-purple{background:#DDAFE9 none repeat scroll 0 50%;border-left-color:#660080;}.k-entity-title-red{background:#FF8080 none repeat scroll 0 50%;border-left-color:#D40000;}.k-entity-title-default div{color:#69312F;}.k-entity-title-green div{color:#250;}.k-entity-title-blue div{color:navy;}.k-entity-title-grey div{color:#1A1A1A;}.k-entity-title-purple div{color:#405;}.k-entity-title-red div{color:maroon;}.k-entity-subtitle-default{background:#DD8A3D none repeat scroll 0 50%;}.k-entity-subtitle-green{background:#5FD35F none repeat scroll 0 50%;}.k-entity-subtitle-blue{background:#06F none repeat scroll 0 50%;}.k-entity-subtitle-grey{background:#4D4D4D none repeat scroll 0 50%;}.k-entity-subtitle-purple{background:#660080 none repeat scroll 0 50%;}.k-entity-subtitle-red{background:#D40000 none repeat scroll 0 50%;}.k-entity-subtitle-default div{color:#FFF;}.k-entity-subtitle-green div{color:#FFF;}.k-entity-subtitle-blue div{color:#FFF;}.k-entity-subtitle-grey div{color:#FFF;}.k-entity-subtitle-purple div{color:#FFF;}.k-entity-subtitle-red div{color:#FFF;}.k-entity-bottom-rd-default,.k-entity-bottom-default,.k-toolselectoritem-sel-default{background:#DD8A3D;}.k-entity-bottom-rd-green,.k-entity-bottom-green,.k-toolselectoritem-sel-green{background:#5FD35F;}.k-entity-bottom-rd-blue,.k-entity-bottom-blue,.k-toolselectoritem-sel-blue{background:#06F;}.k-entity-bottom-rd-grey,.k-entity-bottom-grey,.k-toolselectoritem-sel-grey{background:#4D4D4D;}.k-entity-bottom-rd-purple,.k-entity-bottom-purple,.k-toolselectoritem-sel-purple{background:#660080;}.k-entity-bottom-rd-red,.k-entity-bottom-red,.k-toolselectoritem-sel-red{background:#D40000;}.k-entity-context-default div,.k-entity-context-default .x-tree .x-panel-body{background:#FFD09D none repeat scroll 0 50%;}.k-entity-context-green div,.k-entity-context-green .x-tree .x-panel-body{background:#CFA none repeat scroll 0 50%;}.k-entity-context-blue div,.k-entity-context-blue .x-tree .x-panel-body{background:#ACF none repeat scroll 0 50%;}.k-entity-context-grey div,.k-entity-context-grey .x-tree .x-panel-body{background:#B3B3B3 none repeat scroll 0 50%;}.k-entity-context-purple div,.k-entity-context-purple .x-tree .x-panel-body{background:#DDAFE9 none repeat scroll 0 50%;}.k-entity-context-red div,.k-entity-context-red .x-tree .x-panel-body{background:#FAA none repeat scroll 0 50%;}.k-entity-context-purple .x-tree .x-panel-body{background:#DDAFE9 none repeat scroll 0 50%;}.k-entity-bottom div{/* line-height: 24px; */color:#FFF;}.k-toolbar-top-line{border-top-color:#d0d0d0;border-top-style:solid;border-top-width:1px;}.k-toolbar-bottom-line{border-bottom-color:#d0d0d0;border-bottom-style:solid;border-bottom-width:1px;}.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{white-space:nowrap;font:normal 100% arial, sans;line-height:19px;}.k-toolbar-sep{padding-top:4px;padding-left:5px;}/* Custom gwt-ext styles */.ytb-sep{background-image:url(../js/ext/resources/images/default/grid/grid-split.gif);background-position:center;background-repeat:no-repeat;display:block;font-size:1px;height:16px;width:4px;overflow:hidden;cursor:default;margin:0 2px;border:0;}.ytb-spacer{width:2px;}.x-grid-group-hd{border-bottom:2px solid grey;cursor:pointer;padding-top:3px;}/* Drop down */.k-dropdownouter{background-color:grey;}.k-dropdownouter-members{}.k-dropdownouter-members-default{background-color:#DF5244;}.k-dropdownouter-members-green{background-color:green;}.k-dropdownouter-members-blue{background-color:#5500D4;}.k-dropdownouter-members-grey{background-color:#4D4D4D;}.k-dropdownouter-members-purple{background-color:#672178;}.k-dropdownouter-members-red{background-color:#A02C2C;}.k-dropdownouter-part{}.k-dropdownouter-part-default{background-color:#CA5842;}.k-dropdownouter-part-green{background-color:#0A0;}.k-dropdownouter-part-blue{background-color:#60F;}.k-dropdownouter-part-grey{background-color:#666;}.k-dropdownouter-part-purple{background-color:#892CA0;}.k-dropdownouter-part-red{background-color:#C83737;}.k-dropdownouter-tags{}.k-dropdownouter-tags-default{background-color:#87501E;}.k-dropdownouter-tags-green{background-color:#00D400;}.k-dropdownouter-tags-blue{background-color:#95F;}.k-dropdownouter-tags-grey{background-color:gray;}.k-dropdownouter-tags-purple{background-color:#AB37C8;}.k-dropdownouter-tags-red{background-color:#D35F5F;}.k-dropdownouter-summary{}.k-dropdownouter-summary-default{background-color:#9F734B;}.k-dropdownouter-summary-green{background-color:#4CE14C;}.k-dropdownouter-summary-blue{background-color:#69A5FF;}.k-dropdownouter-summary-grey{background-color:#A6A6A6;}.k-dropdownouter-summary-purple{background-color:#C473D8;}.k-dropdownouter-summary-red{background-color:#E08F8F;}.k-dropdowninner{margin:0 3px 1px;background:green;background-color:#FFF;/* padding: 3px; */}.k-dropdownlabel{color:#FFF;cursor:pointer;}.k-dropdownlabel .gwt-Label{margin:0 5px 0 0;width:100%;}.k-dropdownlabel img{margin:0 3px 0 1px;}/* WsTheme */.k-wstheme-icon-default{background:#FF8C00;}.k-wstheme-icon-green{background:green;}.k-wstheme-icon-blue{background:blue;}.k-wstheme-icon-grey{background:grey;}.k-wstheme-icon-purple{background:purple;}.k-wstheme-icon-red{background:red;}/* Tool selector items */.k-toolselectoritem{width:auto;margin-bottom:5px;cursor:pointer;}.k-toolselectoritem-sel{}.k-toolselectoritem-notsel-default{background:#FFE9A5;}.k-toolselectoritem-notsel-green{background:#D6F4D6;}.k-toolselectoritem-notsel-blue{background:#D7D7F4;}.k-toolselectoritem-notsel-grey{background:#E6E6E6;}.k-toolselectoritem-notsel-purple{background:#EED7F4;}.k-toolselectoritem-notsel-red{background:#FFD5D5;}.k-toolselectoritem-sel a{color:#FFF;padding:0 9px;text-decoration:none;}.k-toolselectoritem-sel a:hover{text-decoration:none;}.k-toolselectoritem-notsel{}.k-toolselectoritem-notsel a{color:#00F;padding:0 9px;text-decoration:none;}.k-toolselectoritem-notsel a:hover{text-decoration:underline;}/* others *//* + padding: 5px; */height:24px;vertical-align:middle;}.gwt-RichTextToolbar table{vertical-align:middle;}.gwt-RichTextToolbar .gwt-ToggleButton{float:left;margin-top:2px;}.gwt-RichTextToolbar .gwt-PushButton{float:left;margin-top:2px;}.gwt-RichTextToolbar .gwt-PushButton-up{margin-right:2px;border:1px solid #F2F2F2;}.gwt-RichTextToolbar .gwt-PushButton-up-hovering{margin-right:2px;border:1px solid #C3D9FF;border-color:#E8F1FF #9daecd #9daecd #e8f1ff;}.gwt-RichTextToolbar .gwt-PushButton-down{margin-right:2px;border:1px solid #C3D9FF;border-color:#9DAECD #e8f1ff #e8f1ff #9daecd;}.gwt-RichTextToolbar .gwt-PushButton-down-hovering{margin-right:2px;border:1px solid #C3D9FF;border-color:#9DAECD #e8f1ff #e8f1ff #9daecd;}.gwt-RichTextToolbar .gwt-ToggleButton-up{margin-right:2px;border:1px solid #F2F2F2;}.gwt-RichTextToolbar .gwt-ToggleButton-up-hovering{margin-right:2px;border:1px solid #C3D9FF;border-color:#E8F1FF #9daecd #9daecd #e8f1ff;}.gwt-RichTextToolbar .gwt-ToggleButton-down{margin-right:2px;background-color:#E8F1FF;border:1px solid #C3D9FF;border-color:#9DAECD #e8f1ff #e8f1ff #9daecd;}.gwt-RichTextToolbar .gwt-ToggleButton-down-hovering{margin-right:2px;background-color:#E8F1FF;border:1px solid #C3D9FF;border-color:#9DAECD #e8f1ff #e8f1ff #9daecd;}.gwt-RichTextToolbar .x-btn{float:left;}.gwt-RichTextToolbar .kune-Button-Large-lSpace{float:left;}.gwt-RichTextToolbar .kune-Button-Large-lrSpace{float:left;}.RichTextToolbar-menu{float:left;margin-top:2px;z-index:4;}.RichTextToolbar-menu table{border-collapse:collapse;border-spacing:0;margin:0;z-index:4;}.RichTextToolbar-menu .gwt-MenuItem{margin-right:2px;border:1px solid #F2F2F2;}.RichTextToolbar-menu .gwt-MenuItem-selected{margin-right:2px;background-color:#E8F1FF;border:1px solid #C3D9FF;border-color:#9DAECD #e8f1ff #e8f1ff #9daecd;}.RichTextToolbar-submenu{background-color:#FFFCD5;border:1px solid #D38D5F;cursor:default;z-index:4;}.RichTextToolbar-submenu .gwt-MenuItem{cursor:default;white-space:nowrap;border:1px solid #FFFCD5;padding:0 4px;}.RichTextToolbar-submenu .gwt-MenuItem-selected{background-color:#FFB958;border:1px solid #C83737;}.kune-WebSafePalette{background-color:#FFF;border:1px solid #AAA;margin:1px;}.kune-WebSafePalette-popup{z-index:9999!important;background-color:#FFF;}.kune-WebSafePalette td{width:12px;height:10px;}.k-site-traybar{background:#FFF none repeat scroll 0 50%;}.k-blank-toolbar{background:#FFF none repeat scroll 0 50%;}.k-sitebar .kune-IconHyperlink{white-space:nowrap;}.k-sitebar .kune-IconHyperlink a:link{cursor:pointer;text-decoration:underline;color:#B3B3B3;}.k-sitebar .kune-IconHyperlink a:hover{text-decoration:underline;}.k-sitebar .kune-IconHyperlink a:visited{color:#B3B3B3;}.k-sitebar-labellink{white-space:nowrap;color:#B3B3B3;cursor:pointer;text-decoration:underline;}.k-sitebar{margin-right:10px;height:16px;background:#FFF;}.k-sitebar .gwt-TextBox{border:1px solid #E4A374;margin:0 15px 0 3px;padding-left:1px;color:#B3B3B3;}.k-sitebar .gwt-Hyperlink a{white-space:nowrap;color:#B3B3B3;text-decoration:underline;cursor:pointer;}.k-sitebar .gwt-PushButton{cursor:pointer;}.k-sitebar-LabelLink{white-space:nowrap;color:#B3B3B3;cursor:pointer;text-decoration:underline;}.k-entity-summary{border-left-color:#FFF;border-left-width:5px;border-bottom-color:#FFF;border-bottom-width:5px;}.k-entitytextlogo-border{border:2px solid #F2F2F2;}.k-entitytextlogo-no-border{border:none;}.k-entitytextlogo{height:60px;margin:0 0 4px;overflow:hidden;width:468px;}.k-entitytextlogo table{vertical-align:middle;}.k-elogo-l-l{font-size:272%;}.k-elogo-l-m{font-size:167%;}.k-elogo-l-s{font-size:108%;}.k-entitytextlogo .gwt-Label{font-weight:700;margin:5px;height:27px;}.k-entitytextlogo-default .gwt-Label{color:#69312F;}.k-entitytextlogo-green .gwt-Label{color:#250;}.k-entitytextlogo-blue .gwt-Label{color:navy;}.k-entitytextlogo-grey .gwt-Label{color:#1A1A1A;}.k-entitytextlogo-purple .gwt-Label{color:#405;}.k-entitytextlogo-red .gwt-Label{color:maroon;}.k-elogo-plink{color:#CCC;font-size:85%;margin:5px;text-decoration:underline;white-space:nowrap;background-color:#FFF;}.k-elogop-expand{background-color:transparent;}.k-entity-default .x-layout-split,.k-entity-default .x-layout-collapsed{background:#DD8A3D none repeat scroll 0 50%;}.k-entity-green .x-layout-split,.k-entity-green .x-layout-collapsed{background:#5FD35F none repeat scroll 0 50%;}.k-entity-blue .x-layout-split,.k-entity-blue .x-layout-collapsed{background:#06F none repeat scroll 0 50%;}.k-entity-grey .x-layout-split,.k-entity-grey .x-layout-collapsed{background:#4D4D4D none repeat scroll 0 50%;}.k-entity-purple .x-layout-split,.k-entity-purple .x-layout-collapsed{background:#660080 none repeat scroll 0 50%;}.k-entity-red .x-layout-split,.k-entity-red .x-layout-collapsed{background:#D40000 none repeat scroll 0 50%;}.k-entityworkspace .x-layout-split,.k-entityworkspace .x-layout-collapsed{background:transparent none repeat scroll 0 50%;}.k-entityworkspace-default .x-layout-split,.k-entityworkspace-default .x-layout-collapsed{background:#DEAA87 none repeat scroll 0 50%;}.k-entityworkspace-green .x-layout-split,.k-entityworkspace-green .x-layout-collapsed{background:#DCE8AB none repeat scroll 0 50%;}.k-entityworkspace-blue .x-layout-split,.k-entityworkspace-blue .x-layout-collapsed{background:#D5D5FF none repeat scroll 0 50%;}.k-entityworkspace-grey .x-layout-split,.k-entityworkspace-grey .x-layout-collapsed{background:#999 none repeat scroll 0 50%;}.k-entityworkspace-purple .x-layout-split,.k-entityworkspace-purple .x-layout-collapsed{background:#A793AC none repeat scroll 0 50%;}.k-entityworkspace-red .x-layout-split,.k-entityworkspace-red .x-layout-collapsed{background:#F55 none repeat scroll 0 50%;}.k-entity-title{border-left-style:solid;border-left-width:2px;}.k-entity-title div{line-height:22px;white-space:nowrap;}.k-entity-subtitle{}.k-entity-subtitle div{line-height:22px;white-space:nowrap;}.k-entity-title-rd-default{background:#DD8A3D;}.k-entity-title-rd-green{background:#5FD35F;}.k-entity-title-rd-blue{background:#06F;}.k-entity-title-rd-grey{background:#4D4D4D;}.k-entity-title-rd-purple{background:#660080;}.k-entity-title-rd-red{background:#D40000;}.k-entity-title-default{background:#F1BB59 none repeat scroll 0 50%;border-left-color:#DD8A3D;}.k-entity-title-green{background:#AFA none repeat scroll 0 50%;border-left-color:#5FD35F;}.k-entity-title-blue{background:#AFDDE9 none repeat scroll 0 50%;border-left-color:#06F;}.k-entity-title-grey{background:#CCC none repeat scroll 0 50%;border-left-color:#4D4D4D;}.k-entity-title-purple{background:#DDAFE9 none repeat scroll 0 50%;border-left-color:#660080;}.k-entity-title-red{background:#FF8080 none repeat scroll 0 50%;border-left-color:#D40000;}.k-entity-title-default div{color:#69312F;}.k-entity-title-green div{color:#250;}.k-entity-title-blue div{color:navy;}.k-entity-title-grey div{color:#1A1A1A;}.k-entity-title-purple div{color:#405;}.k-entity-title-red div{color:maroon;}.k-entity-subtitle-default{background:#DD8A3D none repeat scroll 0 50%;}.k-entity-subtitle-green{background:#5FD35F none repeat scroll 0 50%;}.k-entity-subtitle-blue{background:#06F none repeat scroll 0 50%;}.k-entity-subtitle-grey{background:#4D4D4D none repeat scroll 0 50%;}.k-entity-subtitle-purple{background:#660080 none repeat scroll 0 50%;}.k-entity-subtitle-red{background:#D40000 none repeat scroll 0 50%;}.k-entity-subtitle-default div{color:#FFF;}.k-entity-subtitle-green div{color:#FFF;}.k-entity-subtitle-blue div{color:#FFF;}.k-entity-subtitle-grey div{color:#FFF;}.k-entity-subtitle-purple div{color:#FFF;}.k-entity-subtitle-red div{color:#FFF;}.k-entity-bottom-rd-default,.k-entity-bottom-default,.k-toolselectoritem-sel-default{background:#DD8A3D;}.k-entity-bottom-rd-green,.k-entity-bottom-green,.k-toolselectoritem-sel-green{background:#5FD35F;}.k-entity-bottom-rd-blue,.k-entity-bottom-blue,.k-toolselectoritem-sel-blue{background:#06F;}.k-entity-bottom-rd-grey,.k-entity-bottom-grey,.k-toolselectoritem-sel-grey{background:#4D4D4D;}.k-entity-bottom-rd-purple,.k-entity-bottom-purple,.k-toolselectoritem-sel-purple{background:#660080;}.k-entity-bottom-rd-red,.k-entity-bottom-red,.k-toolselectoritem-sel-red{background:#D40000;}.k-entity-context-default div,.k-entity-context-default .x-tree .x-panel-body{background:#FFD09D none repeat scroll 0 50%;}.k-entity-context-green div,.k-entity-context-green .x-tree .x-panel-body{background:#CFA none repeat scroll 0 50%;}.k-entity-context-blue div,.k-entity-context-blue .x-tree .x-panel-body{background:#ACF none repeat scroll 0 50%;}.k-entity-context-grey div,.k-entity-context-grey .x-tree .x-panel-body{background:#B3B3B3 none repeat scroll 0 50%;}.k-entity-context-purple div,.k-entity-context-purple .x-tree .x-panel-body{background:#DDAFE9 none repeat scroll 0 50%;}.k-entity-context-red div,.k-entity-context-red .x-tree .x-panel-body{background:#FAA none repeat scroll 0 50%;}.k-entity-context-purple .x-tree .x-panel-body{background:#DDAFE9 none repeat scroll 0 50%;}.k-entity-bottom div{/* line-height: 24px; */color:#FFF;}.k-toolbar-top-line{border-top-color:#d0d0d0;border-top-style:solid;border-top-width:1px;}.k-toolbar-bottom-line{border-bottom-color:#d0d0d0;border-bottom-style:solid;border-bottom-width:1px;}.x-toolbar td,.x-toolbar span,.x-toolbar input,.x-toolbar div,.x-toolbar select,.x-toolbar label{white-space:nowrap;font:normal 100% arial, sans;line-height:19px;}.k-toolbar-sep{padding-top:4px;padding-left:5px;}/* Custom gwt-ext styles */.ytb-sep{background-image:url(../js/ext/resources/images/default/grid/grid-split.gif);background-position:center;background-repeat:no-repeat;display:block;font-size:1px;height:16px;width:4px;overflow:hidden;cursor:default;margin:0 2px;border:0;}.ytb-spacer{width:2px;}.x-grid-group-hd{border-bottom:2px solid grey;cursor:pointer;padding-top:3px;}/* Drop down */.k-dropdownouter{background-color:grey;}.k-dropdownouter-members{}.k-dropdownouter-members-default{background-color:#DF5244;}.k-dropdownouter-members-green{background-color:green;}.k-dropdownouter-members-blue{background-color:#5500D4;}.k-dropdownouter-members-grey{background-color:#4D4D4D;}.k-dropdownouter-members-purple{background-color:#672178;}.k-dropdownouter-members-red{background-color:#A02C2C;}.k-dropdownouter-part{}.k-dropdownouter-part-default{background-color:#CA5842;}.k-dropdownouter-part-green{background-color:#0A0;}.k-dropdownouter-part-blue{background-color:#60F;}.k-dropdownouter-part-grey{background-color:#666;}.k-dropdownouter-part-purple{background-color:#892CA0;}.k-dropdownouter-part-red{background-color:#C83737;}.k-dropdownouter-tags{}.k-dropdownouter-tags-default{background-color:#87501E;}.k-dropdownouter-tags-green{background-color:#00D400;}.k-dropdownouter-tags-blue{background-color:#95F;}.k-dropdownouter-tags-grey{background-color:gray;}.k-dropdownouter-tags-purple{background-color:#AB37C8;}.k-dropdownouter-tags-red{background-color:#D35F5F;}.k-dropdownouter-summary{}.k-dropdownouter-summary-default{background-color:#9F734B;}.k-dropdownouter-summary-green{background-color:#4CE14C;}.k-dropdownouter-summary-blue{background-color:#69A5FF;}.k-dropdownouter-summary-grey{background-color:#A6A6A6;}.k-dropdownouter-summary-purple{background-color:#C473D8;}.k-dropdownouter-summary-red{background-color:#E08F8F;}.k-dropdowninner{margin:0 3px 1px;background:green;background-color:#FFF;/* padding: 3px; */}.k-dropdownlabel{color:#FFF;cursor:pointer;}.k-dropdownlabel .gwt-Label{margin:0 5px 0 0;width:100%;}.k-dropdownlabel img{margin:0 3px 0 1px;}/* WsTheme */.k-wstheme-icon-default{background:#FF8C00;}.k-wstheme-icon-green{background:green;}.k-wstheme-icon-blue{background:blue;}.k-wstheme-icon-grey{background:grey;}.k-wstheme-icon-purple{background:purple;}.k-wstheme-icon-red{background:red;}/* Tool selector items */.k-toolselectoritem{width:auto;margin-bottom:5px;cursor:pointer;}.k-toolselectoritem-sel{}.k-toolselectoritem-notsel-default{background:#FFE9A5;}.k-toolselectoritem-notsel-green{background:#D6F4D6;}.k-toolselectoritem-notsel-blue{background:#D7D7F4;}.k-toolselectoritem-notsel-grey{background:#E6E6E6;}.k-toolselectoritem-notsel-purple{background:#EED7F4;}.k-toolselectoritem-notsel-red{background:#FFD5D5;}.k-toolselectoritem-sel a{color:#FFF;padding:0 9px;text-decoration:none;}.k-toolselectoritem-sel a:hover{text-decoration:none;}.k-toolselectoritem-notsel{}.k-toolselectoritem-notsel a{color:#00F;padding:0 9px;text-decoration:none;}.k-toolselectoritem-notsel a:hover{text-decoration:underline;}/* others *//* .x-tree-node a span, .x-dd-drag-ghost a span { color:#000000; padding: 1px 0px 1px 1px; Modified: trunk/src/main/java/org/ourproject/kune/app/public/css/docs.css =================================================================== --- trunk/src/main/java/org/ourproject/kune/app/public/css/docs.css 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/app/public/css/docs.css 2009-03-16 04:13:36 UTC (rev 1078) @@ -142,7 +142,8 @@ } .kune-WebSafePalette-popup { - z-index: 9999 !important; + z-index: 9999 !important; + background-color: #FFF; } .kune-WebSafePalette td { Modified: trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/chat/client/ChatClientModule.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -33,6 +33,7 @@ import org.ourproject.kune.platf.client.i18n.I18nUITranslationService; import org.ourproject.kune.platf.client.registry.ContentCapabilitiesRegistry; import org.ourproject.kune.platf.client.rpc.ContentServiceAsync; +import org.ourproject.kune.platf.client.shortcuts.GlobalShortcutRegister; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; @@ -83,8 +84,10 @@ register(ToolGroup.class, new Factory<ChatEngine>(ChatEngine.class) { @Override public ChatEngine create() { - return new ChatEngineDefault($(I18nUITranslationService.class), $(WorkspaceSkeleton.class), - $(Application.class), $(Session.class), $$(EmiteUIDialog.class), $$(FileDownloadUtils.class)); + final ChatEngineDefault chatEngineDefault = new ChatEngineDefault($(I18nUITranslationService.class), + $(WorkspaceSkeleton.class), $(Application.class), $(Session.class), $$(EmiteUIDialog.class), + $$(FileDownloadUtils.class), $(GlobalShortcutRegister.class)); + return chatEngineDefault; } }); Modified: trunk/src/main/java/org/ourproject/kune/chat/client/ChatEngineDefault.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/chat/client/ChatEngineDefault.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/chat/client/ChatEngineDefault.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -27,6 +27,8 @@ import org.ourproject.kune.platf.client.dto.StateToken; import org.ourproject.kune.platf.client.dto.UserInfoDTO; import org.ourproject.kune.platf.client.i18n.I18nTranslationService; +import org.ourproject.kune.platf.client.shortcuts.ActionShortcut; +import org.ourproject.kune.platf.client.shortcuts.GlobalShortcutRegister; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.ui.WindowUtils; import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; @@ -59,15 +61,24 @@ private final Provider<FileDownloadUtils> downloadUtils; private Collection<RosterItem> roster; private final Event0 onRosterChanged; + private final ActionShortcut shortcut; public ChatEngineDefault(final I18nTranslationService i18n, final WorkspaceSkeleton ws, Application application, Session session, final Provider<EmiteUIDialog> emiteUIProvider, - final Provider<FileDownloadUtils> downloadUtils) { + final Provider<FileDownloadUtils> downloadUtils, GlobalShortcutRegister globalShortcutRegister) { this.i18n = i18n; this.ws = ws; this.emiteUIProvider = emiteUIProvider; this.downloadUtils = downloadUtils; this.onRosterChanged = new Event0("onRosterChanged"); + shortcut = new ActionShortcut(false, true, false, 'C'); + globalShortcutRegister.put(shortcut, new Listener0() { + public void onEvent() { + if (isDialogStarted()) { + toggleShow(); + } + } + }); session.onInitDataReceived(new Listener<InitDataDTO>() { public void onEvent(final InitDataDTO initData) { checkChatDomain(initData.getChatDomain()); @@ -132,6 +143,10 @@ return false; } + public boolean isDialogStarted() { + return !emiteUIProvider.get().isDialogNotStarted(); + } + public boolean isLoggedIn() { return emiteUIProvider.get().isLoggedIn(); } @@ -177,16 +192,12 @@ emiteUIProvider.get().show(OwnStatus.online); if (traybarButton == null) { traybarButton = new ToolbarButton(); - traybarButton.setTooltip(i18n.t("Show/hide the chat window")); + traybarButton.setTooltip(i18n.t("Show/hide the chat window" + shortcut.toString())); traybarButton.setIcon("images/e-icon.gif"); traybarButton.addListener(new ButtonListenerAdapter() { @Override public void onClick(final Button button, final EventObject e) { - if (emiteUIProvider.get().isVisible()) { - emiteUIProvider.get().hide(); - } else { - emiteUIProvider.get().show(); - } + toggleShow(); } }); ws.getSiteTraybar().addButton(traybarButton); @@ -240,6 +251,14 @@ } } + public void toggleShow() { + if (emiteUIProvider.get().isVisible()) { + emiteUIProvider.get().hide(); + } else { + emiteUIProvider.get().show(); + } + } + private XmppURI getLocalUserJid(String shortName) { return XmppURI.jid(shortName + "@" + chatOptions.domain); } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionDescriptor.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionDescriptor.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionDescriptor.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -21,6 +21,7 @@ import org.ourproject.kune.platf.client.dto.AccessRolDTO; import org.ourproject.kune.platf.client.services.ImageDescriptor; +import org.ourproject.kune.platf.client.shortcuts.ActionShortcut; import com.calclab.suco.client.events.Listener; import com.calclab.suco.client.events.Listener0; Deleted: trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcut.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcut.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcut.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -1,125 +0,0 @@ -package org.ourproject.kune.platf.client.actions; - -import org.ourproject.kune.platf.client.i18n.Resources; - -import com.google.gwt.user.client.ui.KeyboardListener; - -public class ActionShortcut { - - private static final String NO_KEYNAME = "nokeyname"; - - private static boolean has(int modifiers, int modifier) { - return ((modifiers & modifier) == modifier); - } - - private final boolean alt; - private final boolean ctrl; - private final boolean shift; - private final char key; - private final String keyName; - - public ActionShortcut(boolean ctrl, boolean alt, boolean shift, char key) { - this(ctrl, alt, shift, key, NO_KEYNAME); - } - - public ActionShortcut(boolean ctrl, boolean alt, boolean shift, char key, String keyName) { - this.alt = alt; - this.ctrl = ctrl; - this.shift = shift; - this.key = key; - this.keyName = keyName; - } - - public ActionShortcut(boolean ctrl, boolean shift, char key) { - this(ctrl, false, shift, key, NO_KEYNAME); - } - - public ActionShortcut(boolean ctrl, boolean shift, char key, String keyName) { - this(ctrl, false, shift, key, keyName); - } - - public ActionShortcut(boolean ctrl, char key) { - this(ctrl, false, false, key, NO_KEYNAME); - } - - public ActionShortcut(boolean ctrl, char key, String keyName) { - this(ctrl, false, false, key, keyName); - } - - public ActionShortcut(char key, int modifiers) { - this(has(modifiers, KeyboardListener.MODIFIER_CTRL), has(modifiers, KeyboardListener.MODIFIER_ALT), has( - modifiers, KeyboardListener.MODIFIER_SHIFT), key, NO_KEYNAME); - } - - public ActionShortcut(char key, int modifiers, String keyName) { - this(has(modifiers, KeyboardListener.MODIFIER_CTRL), has(modifiers, KeyboardListener.MODIFIER_ALT), has( - modifiers, KeyboardListener.MODIFIER_SHIFT), key, keyName); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - ActionShortcut other = (ActionShortcut) obj; - if (alt != other.alt) { - return false; - } - if (ctrl != other.ctrl) { - return false; - } - if (key != other.key) { - return false; - } - if (shift != other.shift) { - return false; - } - return true; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + (alt ? 1231 : 1237); - result = prime * result + (ctrl ? 1231 : 1237); - result = prime * result + key; - result = prime * result + (shift ? 1231 : 1237); - return result; - } - - public boolean is(char keyCode, int modifiers) { - return (keyCode == keyCode && same(modifiers, KeyboardListener.MODIFIER_ALT, alt) - && same(modifiers, KeyboardListener.MODIFIER_CTRL, ctrl) && same(modifiers, - KeyboardListener.MODIFIER_SHIFT, shift)); - } - - public boolean same(int modifiers, int modifier, boolean keyValue) { - return (has(modifiers, modifier) == keyValue); - } - - @Override - public String toString() { - String s = " ("; - s += sKey(alt, "Alt"); - s += sKey(ctrl, "Ctrl"); - s += sKey(shift, "Shift"); - s += keyName != NO_KEYNAME ? translateKey(keyName) + ")" : String.valueOf(key).toUpperCase() + ")"; - return s; - } - - private String sKey(boolean key, String specialKeyName) { - return key ? translateKey(specialKeyName) + "+" : ""; - } - - private String translateKey(String keyNameToTranslate) { - return Resources.i18n.tWithNT(keyNameToTranslate, "The '" + keyNameToTranslate + "' keyboard key"); - } - -} Deleted: trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcutRegister.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcutRegister.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcutRegister.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -1,60 +0,0 @@ -package org.ourproject.kune.platf.client.actions; - -import java.util.HashMap; - -import org.ourproject.kune.platf.client.dto.AccessRolDTO; - -import com.allen_sauer.gwt.log.client.Log; -import com.calclab.suco.client.events.Listener0; -import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.ui.KeyboardListenerCollection; - -public class ActionShortcutRegister { - - @SuppressWarnings("unchecked") - private final HashMap<ActionShortcut, ActionItem> shortcuts; - - @SuppressWarnings("unchecked") - public ActionShortcutRegister() { - shortcuts = new HashMap<ActionShortcut, ActionItem>(); - } - - @SuppressWarnings("unchecked") - public ActionItem get(ActionShortcut shortcut) { - return shortcuts.get(shortcut); - } - - @SuppressWarnings("unchecked") - public ActionItem get(Event event) { - int modifiers = KeyboardListenerCollection.getKeyboardModifiers(event); - if (event.getTypeInt() == Event.ONKEYDOWN && modifiers != 0) { - ActionShortcut shortcut = new ActionShortcut((char) event.getKeyCode(), modifiers); - Log.debug("Shortcut pressed" + shortcut.toString()); - return shortcuts.get(shortcut); - } - // if (modifiers != 0) { - // Log.debug("Not action associated with this shortcut"); - // } - return null; - } - - @SuppressWarnings("unchecked") - public void put(ActionShortcut shortcut, ActionItem actionItem) { - if (shortcuts.get(shortcut) != null) { - Log.warn("Shortcut" + shortcut + " already registered"); - } - shortcuts.put(shortcut, actionItem); - } - - @SuppressWarnings("unchecked") - public void put(ActionShortcut shortcut, final Listener0 listener) { - ActionDescriptor descriptor = new ActionDescriptor(AccessRolDTO.Viewer, new Listener0() { - public void onEvent() { - listener.onEvent(); - } - }); - ActionItem item = new ActionItem(descriptor, null); - put(shortcut, item); - } - -} Modified: trunk/src/main/java/org/ourproject/kune/platf/client/actions/toolbar/ActionToolbarButton.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/actions/toolbar/ActionToolbarButton.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/actions/toolbar/ActionToolbarButton.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -1,7 +1,7 @@ package org.ourproject.kune.platf.client.actions.toolbar; -import org.ourproject.kune.platf.client.actions.ActionShortcut; import org.ourproject.kune.platf.client.actions.ActionToolbarDescriptor; +import org.ourproject.kune.platf.client.shortcuts.ActionShortcut; import com.calclab.suco.client.events.Listener0; import com.gwtext.client.core.EventObject; Modified: trunk/src/main/java/org/ourproject/kune/platf/client/services/PlatformModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/services/PlatformModule.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/services/PlatformModule.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -36,6 +36,7 @@ import org.ourproject.kune.platf.client.rpc.I18nServiceAsync; import org.ourproject.kune.platf.client.rpc.UserService; import org.ourproject.kune.platf.client.rpc.UserServiceAsync; +import org.ourproject.kune.platf.client.shortcuts.GlobalShortcutRegister; import org.ourproject.kune.platf.client.state.ContentProvider; import org.ourproject.kune.platf.client.state.ContentProviderDefault; import org.ourproject.kune.platf.client.state.Session; @@ -48,6 +49,9 @@ import org.ourproject.kune.platf.client.ui.palette.ColorWebSafePalette; import org.ourproject.kune.platf.client.ui.palette.ColorWebSafePalettePanel; import org.ourproject.kune.platf.client.ui.palette.ColorWebSafePalettePresenter; +import org.ourproject.kune.platf.client.ui.palette.SimplePalette; +import org.ourproject.kune.platf.client.ui.palette.SimplePalettePanel; +import org.ourproject.kune.platf.client.ui.palette.SimplePalettePresenter; import org.ourproject.kune.platf.client.ui.rte.TestRTEDialog; import org.ourproject.kune.platf.client.ui.rte.basic.RTEActionSndToolbar; import org.ourproject.kune.platf.client.ui.rte.basic.RTEActionTopToolbar; @@ -55,9 +59,9 @@ import org.ourproject.kune.platf.client.ui.rte.basic.RTEditorPanel; import org.ourproject.kune.platf.client.ui.rte.basic.RTEditorPresenter; import org.ourproject.kune.platf.client.ui.rte.edithtml.EditHtmlDialog; -import org.ourproject.kune.platf.client.ui.rte.edithtml.EditHtmlGroup; import org.ourproject.kune.platf.client.ui.rte.edithtml.EditHtmlDialogPanel; import org.ourproject.kune.platf.client.ui.rte.edithtml.EditHtmlDialogPresenter; +import org.ourproject.kune.platf.client.ui.rte.edithtml.EditHtmlGroup; import org.ourproject.kune.platf.client.ui.rte.edithtml.editor.EditHtmlEditor; import org.ourproject.kune.platf.client.ui.rte.edithtml.editor.EditHtmlEditorPanel; import org.ourproject.kune.platf.client.ui.rte.edithtml.editor.EditHtmlEditorPresenter; @@ -66,16 +70,16 @@ import org.ourproject.kune.platf.client.ui.rte.edithtml.preview.EditHtmlPreviewPresenter; import org.ourproject.kune.platf.client.ui.rte.img.RTEImgResources; import org.ourproject.kune.platf.client.ui.rte.insertimg.InsertImageDialog; -import org.ourproject.kune.platf.client.ui.rte.insertimg.InsertImageGroup; import org.ourproject.kune.platf.client.ui.rte.insertimg.InsertImageDialogPanel; import org.ourproject.kune.platf.client.ui.rte.insertimg.InsertImageDialogPresenter; +import org.ourproject.kune.platf.client.ui.rte.insertimg.InsertImageGroup; import org.ourproject.kune.platf.client.ui.rte.insertimg.ext.InsertImageExt; import org.ourproject.kune.platf.client.ui.rte.insertimg.ext.InsertImageExtPanel; import org.ourproject.kune.platf.client.ui.rte.insertimg.ext.InsertImageExtPresenter; import org.ourproject.kune.platf.client.ui.rte.insertlink.InsertLinkDialog; -import org.ourproject.kune.platf.client.ui.rte.insertlink.InsertLinkGroup; import org.ourproject.kune.platf.client.ui.rte.insertlink.InsertLinkDialogPanel; import org.ourproject.kune.platf.client.ui.rte.insertlink.InsertLinkDialogPresenter; +import org.ourproject.kune.platf.client.ui.rte.insertlink.InsertLinkGroup; import org.ourproject.kune.platf.client.ui.rte.insertlink.email.InsertLinkEmail; import org.ourproject.kune.platf.client.ui.rte.insertlink.email.InsertLinkEmailPanel; import org.ourproject.kune.platf.client.ui.rte.insertlink.email.InsertLinkEmailPresenter; @@ -83,6 +87,9 @@ import org.ourproject.kune.platf.client.ui.rte.insertlink.ext.InsertLinkExtPanel; import org.ourproject.kune.platf.client.ui.rte.insertlink.ext.InsertLinkExtPresenter; import org.ourproject.kune.platf.client.ui.rte.insertlink.ext.InsertLinkExtView; +import org.ourproject.kune.platf.client.ui.rte.inserttable.InsertTableDialog; +import org.ourproject.kune.platf.client.ui.rte.inserttable.InsertTableDialogPanel; +import org.ourproject.kune.platf.client.ui.rte.inserttable.InsertTableDialogPresenter; import org.ourproject.kune.platf.client.ui.rte.saving.RTESavingEditor; import org.ourproject.kune.platf.client.ui.rte.saving.RTESavingEditorPanel; import org.ourproject.kune.platf.client.ui.rte.saving.RTESavingEditorPresenter; @@ -250,6 +257,16 @@ } }); + register(Singleton.class, new Factory<SimplePalette>(SimplePalette.class) { + @Override + public SimplePalette create() { + final SimplePalettePresenter presenter = new SimplePalettePresenter(); + final SimplePalettePanel panel = new SimplePalettePanel(presenter, i18n); + presenter.init(panel); + return presenter; + } + }); + register(NoDecoration.class, new Factory<RTEActionTopToolbar>(RTEActionTopToolbar.class) { @Override public RTEActionTopToolbar create() { @@ -281,9 +298,9 @@ final RTEditorPresenter presenter = new RTEditorPresenter($(I18nTranslationService.class), $(Session.class), topBar, sndBar, $(RTEImgResources.class), $(InsertLinkDialog.class), $(ColorWebSafePalette.class), $$(EditHtmlDialog.class), $$(InsertImageDialog.class), - $(DeferredCommandWrapper.class)); + $$(InsertTableDialog.class), $(DeferredCommandWrapper.class)); final RTEditorPanel panel = new RTEditorPanel(presenter, $(I18nUITranslationService.class), - $(ActionManager.class)); + $(ActionManager.class), $(GlobalShortcutRegister.class)); presenter.init(panel); return presenter; } @@ -357,8 +374,8 @@ @Override public InsertImageDialog create() { final InsertImageDialogPresenter presenter = new InsertImageDialogPresenter(); - final InsertImageDialogPanel panel = new InsertImageDialogPanel(presenter, $(I18nTranslationService.class), - $(Images.class), $(InsertImageGroup.class)); + final InsertImageDialogPanel panel = new InsertImageDialogPanel(presenter, + $(I18nTranslationService.class), $(Images.class), $(InsertImageGroup.class)); presenter.init(panel); return presenter; } @@ -385,32 +402,37 @@ } }); - register(InsertLinkGroup.class, - new Factory<InsertLinkExt>(InsertLinkExt.class) { - @Override - public InsertLinkExt create() { - final InsertLinkExtPresenter presenter = new InsertLinkExtPresenter( - $(InsertLinkDialog.class)); - final InsertLinkExtView panel = new InsertLinkExtPanel(presenter, - $(I18nTranslationService.class)); - presenter.init(panel); - return presenter; - } - }); + register(InsertLinkGroup.class, new Factory<InsertLinkExt>(InsertLinkExt.class) { + @Override + public InsertLinkExt create() { + final InsertLinkExtPresenter presenter = new InsertLinkExtPresenter($(InsertLinkDialog.class)); + final InsertLinkExtView panel = new InsertLinkExtPanel(presenter, $(I18nTranslationService.class)); + presenter.init(panel); + return presenter; + } + }); - register(InsertLinkGroup.class, new Factory<InsertLinkEmail>( - InsertLinkEmail.class) { + register(InsertLinkGroup.class, new Factory<InsertLinkEmail>(InsertLinkEmail.class) { @Override public InsertLinkEmail create() { - final InsertLinkEmailPresenter presenter = new InsertLinkEmailPresenter( - $(InsertLinkDialog.class)); - final InsertLinkEmailPanel panel = new InsertLinkEmailPanel(presenter, - $(I18nTranslationService.class)); + final InsertLinkEmailPresenter presenter = new InsertLinkEmailPresenter($(InsertLinkDialog.class)); + final InsertLinkEmailPanel panel = new InsertLinkEmailPanel(presenter, $(I18nTranslationService.class)); presenter.init(panel); return presenter; } }); + register(Singleton.class, new Factory<InsertTableDialog>(InsertTableDialog.class) { + @Override + public InsertTableDialog create() { + final InsertTableDialogPresenter presenter = new InsertTableDialogPresenter(); + final InsertTableDialogPanel panel = new InsertTableDialogPanel(presenter, i18n, + $$(SimplePalette.class)); + presenter.init(panel); + return presenter; + } + }); + $(ApplicationComponentGroup.class).createAll(); $(ToolGroup.class).createAll(); $(Application.class).start(); Copied: trunk/src/main/java/org/ourproject/kune/platf/client/shortcuts/ActionShortcut.java (from rev 1076, trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcut.java) =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcut.java 2009-03-15 17:29:41 UTC (rev 1076) +++ trunk/src/main/java/org/ourproject/kune/platf/client/shortcuts/ActionShortcut.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,125 @@ +package org.ourproject.kune.platf.client.shortcuts; + +import org.ourproject.kune.platf.client.i18n.Resources; + +import com.google.gwt.user.client.ui.KeyboardListener; + +public class ActionShortcut { + + private static final String NO_KEYNAME = "nokeyname"; + + private static boolean has(int modifiers, int modifier) { + return ((modifiers & modifier) == modifier); + } + + private final boolean alt; + private final boolean ctrl; + private final boolean shift; + private final char key; + private final String keyName; + + public ActionShortcut(boolean ctrl, boolean alt, boolean shift, char key) { + this(ctrl, alt, shift, key, NO_KEYNAME); + } + + public ActionShortcut(boolean ctrl, boolean alt, boolean shift, char key, String keyName) { + this.alt = alt; + this.ctrl = ctrl; + this.shift = shift; + this.key = key; + this.keyName = keyName; + } + + public ActionShortcut(boolean ctrl, boolean shift, char key) { + this(ctrl, false, shift, key, NO_KEYNAME); + } + + public ActionShortcut(boolean ctrl, boolean shift, char key, String keyName) { + this(ctrl, false, shift, key, keyName); + } + + public ActionShortcut(boolean ctrl, char key) { + this(ctrl, false, false, key, NO_KEYNAME); + } + + public ActionShortcut(boolean ctrl, char key, String keyName) { + this(ctrl, false, false, key, keyName); + } + + public ActionShortcut(char key, int modifiers) { + this(has(modifiers, KeyboardListener.MODIFIER_CTRL), has(modifiers, KeyboardListener.MODIFIER_ALT), has( + modifiers, KeyboardListener.MODIFIER_SHIFT), key, NO_KEYNAME); + } + + public ActionShortcut(char key, int modifiers, String keyName) { + this(has(modifiers, KeyboardListener.MODIFIER_CTRL), has(modifiers, KeyboardListener.MODIFIER_ALT), has( + modifiers, KeyboardListener.MODIFIER_SHIFT), key, keyName); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + ActionShortcut other = (ActionShortcut) obj; + if (alt != other.alt) { + return false; + } + if (ctrl != other.ctrl) { + return false; + } + if (key != other.key) { + return false; + } + if (shift != other.shift) { + return false; + } + return true; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + (alt ? 1231 : 1237); + result = prime * result + (ctrl ? 1231 : 1237); + result = prime * result + key; + result = prime * result + (shift ? 1231 : 1237); + return result; + } + + public boolean is(char keyCode, int modifiers) { + return (keyCode == keyCode && same(modifiers, KeyboardListener.MODIFIER_ALT, alt) + && same(modifiers, KeyboardListener.MODIFIER_CTRL, ctrl) && same(modifiers, + KeyboardListener.MODIFIER_SHIFT, shift)); + } + + public boolean same(int modifiers, int modifier, boolean keyValue) { + return (has(modifiers, modifier) == keyValue); + } + + @Override + public String toString() { + String s = " ("; + s += sKey(alt, "Alt"); + s += sKey(ctrl, "Ctrl"); + s += sKey(shift, "Shift"); + s += keyName != NO_KEYNAME ? translateKey(keyName) + ")" : String.valueOf(key).toUpperCase() + ")"; + return s; + } + + private String sKey(boolean key, String specialKeyName) { + return key ? translateKey(specialKeyName) + "+" : ""; + } + + private String translateKey(String keyNameToTranslate) { + return Resources.i18n.tWithNT(keyNameToTranslate, "The '" + keyNameToTranslate + "' keyboard key"); + } + +} Copied: trunk/src/main/java/org/ourproject/kune/platf/client/shortcuts/ActionShortcutRegister.java (from rev 1076, trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcutRegister.java) =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/actions/ActionShortcutRegister.java 2009-03-15 17:29:41 UTC (rev 1076) +++ trunk/src/main/java/org/ourproject/kune/platf/client/shortcuts/ActionShortcutRegister.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,62 @@ +package org.ourproject.kune.platf.client.shortcuts; + +import java.util.HashMap; + +import org.ourproject.kune.platf.client.actions.ActionDescriptor; +import org.ourproject.kune.platf.client.actions.ActionItem; +import org.ourproject.kune.platf.client.dto.AccessRolDTO; + +import com.allen_sauer.gwt.log.client.Log; +import com.calclab.suco.client.events.Listener0; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.ui.KeyboardListenerCollection; + +public class ActionShortcutRegister { + + @SuppressWarnings("unchecked") + private final HashMap<ActionShortcut, ActionItem> shortcuts; + + @SuppressWarnings("unchecked") + public ActionShortcutRegister() { + shortcuts = new HashMap<ActionShortcut, ActionItem>(); + } + + @SuppressWarnings("unchecked") + public ActionItem get(ActionShortcut shortcut) { + return shortcuts.get(shortcut); + } + + @SuppressWarnings("unchecked") + public ActionItem get(Event event) { + int modifiers = KeyboardListenerCollection.getKeyboardModifiers(event); + if (event.getTypeInt() == Event.ONKEYDOWN && modifiers != 0) { + ActionShortcut shortcut = new ActionShortcut((char) event.getKeyCode(), modifiers); + Log.debug("Shortcut pressed" + shortcut.toString()); + return shortcuts.get(shortcut); + } + // if (modifiers != 0) { + // Log.debug("Not action associated with this shortcut"); + // } + return null; + } + + @SuppressWarnings("unchecked") + public void put(ActionShortcut shortcut, ActionItem actionItem) { + if (shortcuts.get(shortcut) != null) { + Log.warn("Shortcut" + shortcut + " already registered"); + } + shortcuts.put(shortcut, actionItem); + } + + @SuppressWarnings("unchecked") + public void put(ActionShortcut shortcut, final Listener0 listener) { + ActionDescriptor descriptor = new ActionDescriptor(AccessRolDTO.Viewer, new Listener0() { + public void onEvent() { + listener.onEvent(); + } + }); + ActionItem item = new ActionItem(descriptor, null); + put(shortcut, item); + } + +} Copied: trunk/src/main/java/org/ourproject/kune/platf/client/shortcuts/GlobalShortcutRegister.java (from rev 1076, trunk/src/main/java/org/ourproject/kune/workspace/client/events/GlobalShortcutRegister.java) =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/events/GlobalShortcutRegister.java 2009-03-15 17:29:41 UTC (rev 1076) +++ trunk/src/main/java/org/ourproject/kune/platf/client/shortcuts/GlobalShortcutRegister.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,37 @@ +package org.ourproject.kune.platf.client.shortcuts; + +import org.ourproject.kune.platf.client.actions.ActionItem; +import org.ourproject.kune.platf.client.actions.ActionManager; + +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Event; +import com.google.gwt.user.client.EventPreview; + +public class GlobalShortcutRegister extends ActionShortcutRegister { + + private final EventPreview eventPreview; + + public GlobalShortcutRegister(final ActionManager actionManager) { + eventPreview = new EventPreview() { + @SuppressWarnings("unchecked") + public boolean onEventPreview(Event event) { + ActionItem actionItem = get(event); + if (actionItem != null) { + // Log.debug("Not propagating event"); + DOM.eventPreventDefault(event); + actionManager.doAction(actionItem); + return false; + } + return true; + } + }; + } + + public void disable() { + DOM.removeEventPreview(eventPreview); + } + + public void enable() { + DOM.addEventPreview(eventPreview); + } +} Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/TextUtils.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/TextUtils.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/TextUtils.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -34,6 +34,8 @@ public static final String UNIX_NAME = "^[a-z0-9_\\-]+$"; + public static final String NUM_REGEXP = "^[0-9]+$"; + /* * This method escape only some dangerous html chars */ Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/dialogs/DefaultForm.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/dialogs/DefaultForm.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/dialogs/DefaultForm.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -29,10 +29,11 @@ public class DefaultForm { - protected static final int DEF_FIELD_WIDTH = 200; - protected static final int DEF_SMALL_FIELD_WIDTH = 100; - protected static final int DEF_MEDIUM_FIELD_WIDTH = 150; - protected static final int DEF_FIELD_LABEL_WITH = 75; + public static final int DEF_FIELD_WIDTH = 200; + public static final int DEF_SMALL_FIELD_WIDTH = 100; + public static final int DEF_XSMALL_FIELD_WIDTH = 50; + public static final int DEF_MEDIUM_FIELD_WIDTH = 150; + public static final int DEF_FIELD_LABEL_WITH = 75; private final FormPanel form; Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalette.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalette.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalette.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,11 @@ +package org.ourproject.kune.platf.client.ui.palette; + +import com.calclab.suco.client.events.Listener; + +public interface AbstractPalette { + + void hide(); + + void show(int left, int top, Listener<String> onColorSelected); + +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalettePanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalettePanel.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalettePanel.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,32 @@ +package org.ourproject.kune.platf.client.ui.palette; + +import com.google.gwt.user.client.ui.PopupPanel; +import com.google.gwt.user.client.ui.Widget; + +public abstract class AbstractPalettePanel { + private PopupPanel popupPalette; + Widget widget; + + public void hide() { + if (popupPalette != null) { + popupPalette.hide(); + } + } + + public void show(final int left, final int top) { + if (widget == null) { + createPalette(); + } + popupPalette = new PopupPanel(true, true); + popupPalette.addStyleName("kune-WebSafePalette-popup"); + popupPalette.setVisible(false); + popupPalette.show(); + popupPalette.setPopupPosition(left, top); + popupPalette.setWidget(widget); + popupPalette.setVisible(true); + } + + protected void createPalette() { + } + +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalettePresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalettePresenter.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPalettePresenter.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,28 @@ +package org.ourproject.kune.platf.client.ui.palette; + +import com.calclab.suco.client.events.Listener; + +public abstract class AbstractPalettePresenter { + + protected Listener<String> onColorSelected; + private AbstractPaletteView view; + + public void hide() { + this.view.hide(); + } + + public void init(final AbstractPaletteView view) { + this.view = view; + } + + public void show(final int left, final int top, final Listener<String> onColorSelected) { + view.show(left, top); + this.onColorSelected = onColorSelected; + } + + protected void onColorSelected(final String color) { + onColorSelected.onEvent(color); + view.hide(); + } + +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPaletteView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPaletteView.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/AbstractPaletteView.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,11 @@ +package org.ourproject.kune.platf.client.ui.palette; + +import org.ourproject.kune.platf.client.View; + +public interface AbstractPaletteView extends View { + + void hide(); + + void show(int left, int top); + +} Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalette.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalette.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalette.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -19,12 +19,7 @@ \*/ package org.ourproject.kune.platf.client.ui.palette; -import com.calclab.suco.client.events.Listener; -public interface ColorWebSafePalette { +public interface ColorWebSafePalette extends AbstractPalette { - void hide(); - - void show(int left, int top, Listener<String> onColorSelected); - } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalettePanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalettePanel.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalettePanel.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -21,7 +21,6 @@ import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.ui.Grid; -import com.google.gwt.user.client.ui.PopupPanel; import com.google.gwt.user.client.ui.SourcesTableEvents; import com.google.gwt.user.client.ui.TableListener; @@ -31,38 +30,18 @@ * http://en.wikipedia.org/wiki/Web_colors#Web-safe_colors * */ -public class ColorWebSafePalettePanel implements ColorWebSafePaletteView { +public class ColorWebSafePalettePanel extends AbstractPalettePanel implements ColorWebSafePaletteView { - Grid paletteGrid; private final ColorWebSafePalettePresenter presenter; - private PopupPanel popupPalette; public ColorWebSafePalettePanel(final ColorWebSafePalettePresenter initPresenter) { this.presenter = initPresenter; } - public void hide() { - if (popupPalette != null) { - popupPalette.hide(); - } - } + @Override + protected void createPalette() { + Grid paletteGrid = new Grid(ROWS, COLS); - public void show(final int left, final int top) { - if (paletteGrid == null) { - createPalette(); - } - popupPalette = new PopupPanel(true, true); - popupPalette.addStyleName("kune-WebSafePalette-popup"); - popupPalette.setVisible(false); - popupPalette.show(); - popupPalette.setPopupPosition(left, top); - popupPalette.setWidget(paletteGrid); - popupPalette.setVisible(true); - } - - private void createPalette() { - paletteGrid = new Grid(ROWS, COLS); - paletteGrid.setCellSpacing(1); // Put color values in the grid cells @@ -88,5 +67,6 @@ presenter.onColorSelected(row, col); } }); + widget = paletteGrid; } } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalettePresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalettePresenter.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePalettePresenter.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -19,32 +19,11 @@ */ package org.ourproject.kune.platf.client.ui.palette; -import com.calclab.suco.client.events.Listener; +public class ColorWebSafePalettePresenter extends AbstractPalettePresenter implements ColorWebSafePalette { -public class ColorWebSafePalettePresenter implements ColorWebSafePalette { - - private Listener<String> onColorSelected; - private ColorWebSafePaletteView view; - - public ColorWebSafePalettePresenter() { - } - - public void hide() { - this.view.hide(); - } - - public void init(final ColorWebSafePaletteView view) { - this.view = view; - } - - public void show(final int left, final int top, final Listener<String> onColorSelected) { - view.show(left, top); - this.onColorSelected = onColorSelected; - } - protected void onColorSelected(final int row, final int col) { final String color = getColor(row, col); - onColorSelected.onEvent(color); + onColorSelected(color); } private String getColor(final int row, final int col) { Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePaletteView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePaletteView.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/ColorWebSafePaletteView.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -19,7 +19,7 @@ */ package org.ourproject.kune.platf.client.ui.palette; -public interface ColorWebSafePaletteView { +public interface ColorWebSafePaletteView extends AbstractPaletteView { int ROWS = 18; @@ -27,8 +27,4 @@ String COLORS[] = { "0", "3", "6", "9", "C", "F" }; - void hide(); - - void show(int left, int top); - } Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalette.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalette.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalette.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,4 @@ +package org.ourproject.kune.platf.client.ui.palette; + +public interface SimplePalette extends AbstractPalette { +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalettePanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalettePanel.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalettePanel.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,30 @@ +package org.ourproject.kune.platf.client.ui.palette; + +import org.ourproject.kune.platf.client.i18n.I18nTranslationService; + +import com.gwtext.client.widgets.ColorPalette; +import com.gwtext.client.widgets.event.ColorPaletteListenerAdapter; + +public class SimplePalettePanel extends AbstractPalettePanel implements SimplePaletteView { + + private final SimplePalettePresenter presenter; + private final I18nTranslationService i18n; + + public SimplePalettePanel(final SimplePalettePresenter presenter, I18nTranslationService i18n) { + this.presenter = presenter; + this.i18n = i18n; + } + + @Override + protected void createPalette() { + ColorPalette colorPalette = new ColorPalette(); + colorPalette.setTitle(i18n.t("Pick a color")); + colorPalette.addListener(new ColorPaletteListenerAdapter() { + @Override + public void onSelect(ColorPalette colorPalette, String color) { + presenter.onColorSelected(color); + } + }); + widget = colorPalette; + } +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalettePresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalettePresenter.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePalettePresenter.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,6 @@ +package org.ourproject.kune.platf.client.ui.palette; + + +public class SimplePalettePresenter extends AbstractPalettePresenter implements SimplePalette { + +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePaletteView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePaletteView.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/palette/SimplePaletteView.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,5 @@ +package org.ourproject.kune.platf.client.ui.palette; + + +public interface SimplePaletteView extends AbstractPaletteView { +} Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/RichTextArea.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/RichTextArea.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/RichTextArea.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -18,6 +18,7 @@ import org.ourproject.kune.platf.client.ui.rte.impl.RichTextAreaImpl; import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.IFrameElement; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.FocusWidget; @@ -25,6 +26,7 @@ import com.google.gwt.user.client.ui.MouseListener; import com.google.gwt.user.client.ui.MouseListenerCollection; import com.google.gwt.user.client.ui.SourcesMouseEvents; +import com.xpn.xwiki.wysiwyg.client.dom.Document; /** * A rich text editor that allows complex styling and formatting. @@ -391,6 +393,28 @@ } /** + * NOTE: If the current browser doesn't support rich text editing this + * method returns <code>null</code>. You should test the returned value and + * fail save to an appropriate behavior!<br/> + * The appropriate test would be: <code><pre> + * if (rta.isAttached() && rta.getDocument() == null) { + * // The current browser doesn't support rich text editing. + * } + * </pre></code> + * + * @return The DOM document being edited with this rich text area. + * + * copied from xwiki + */ + public Document getDocument() { + if (getElement().getTagName().equalsIgnoreCase("iframe")) { + return IFrameElement.as(getElement()).getContentDocument().cast(); + } else { + return null; + } + } + + /** * Gets the full rich text formatting interface. * * @return <code>null</code> if full formatting is not supported Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/basic/RTEditorPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/basic/RTEditorPanel.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/basic/RTEditorPanel.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -16,18 +16,17 @@ import org.ourproject.kune.platf.client.actions.ActionItem; import org.ourproject.kune.platf.client.actions.ActionItemCollection; import org.ourproject.kune.platf.client.actions.ActionManager; -import org.ourproject.kune.platf.client.actions.ActionShortcut; -import org.ourproject.kune.platf.client.actions.ActionShortcutRegister; import org.ourproject.kune.platf.client.i18n.I18nUITranslationService; +import org.ourproject.kune.platf.client.shortcuts.ActionShortcut; +import org.ourproject.kune.platf.client.shortcuts.ActionShortcutRegister; +import org.ourproject.kune.platf.client.shortcuts.GlobalShortcutRegister; import org.ourproject.kune.platf.client.ui.rte.RichTextArea; import com.google.gwt.dom.client.Element; -import com.google.gwt.dom.client.IFrameElement; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.FocusListener; import com.google.gwt.user.client.ui.Widget; -import com.xpn.xwiki.wysiwyg.client.dom.Document; import com.xpn.xwiki.wysiwyg.client.dom.DocumentFragment; import com.xpn.xwiki.wysiwyg.client.dom.Range; import com.xpn.xwiki.wysiwyg.client.dom.Selection; @@ -49,18 +48,20 @@ private final RTEditorPresenter presenter; private final ActionManager actionManager; private final ActionShortcutRegister shortcutRegister; + private final GlobalShortcutRegister globalShortcutReg; public RTEditorPanel(final RTEditorPresenter presenter, I18nUITranslationService i18n, - final ActionManager actionManager) { + final ActionManager actionManager, GlobalShortcutRegister globalShortcutReg) { this.presenter = presenter; this.i18n = i18n; this.actionManager = actionManager; + this.globalShortcutReg = globalShortcutReg; basic = getBasicFormatter(); extended = getExtendedFormatter(); shortcutRegister = new ActionShortcutRegister(); EventListener listener = new EventListener(); addFocusListener(listener); - setWidth("97%"); + setWidth("96%"); setHeight("100%"); } @@ -107,28 +108,6 @@ setFocus(true); } - /** - * NOTE: If the current browser doesn't support rich text editing this - * method returns <code>null</code>. You should test the returned value and - * fail save to an appropriate behavior!<br/> - * The appropriate test would be: <code><pre> - * if (rta.isAttached() && rta.getDocument() == null) { - * // The current browser doesn't support rich text editing. - * } - * </pre></code> - * - * @return The DOM document being edited with this rich text area. - * - * copied from xwiki - */ - public Document getDocument() { - if (getElement().getTagName().equalsIgnoreCase("iframe")) { - return IFrameElement.as(getElement()).getContentDocument().cast(); - } else { - return null; - } - } - public void insertComment(String author) { String comment = null; createCommentAndSelectIt(author, comment); @@ -221,7 +200,8 @@ super.onBrowserEvent(event); break; case Event.ONKEYDOWN: - ActionItem actionItem = shortcutRegister.get(event); + ActionItem rtaActionItem = shortcutRegister.get(event); + ActionItem actionItem = rtaActionItem != null ? rtaActionItem : globalShortcutReg.get(event); if (actionItem != null) { updateStatus(); fireEdit(); Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/basic/RTEditorPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/basic/RTEditorPresenter.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/basic/RTEditorPresenter.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -7,7 +7,6 @@ import org.ourproject.kune.platf.client.actions.ActionEnableCondition; import org.ourproject.kune.platf.client.actions.ActionItem; import org.ourproject.kune.platf.client.actions.ActionItemCollection; -import org.ourproject.kune.platf.client.actions.ActionShortcut; import org.ourproject.kune.platf.client.actions.ActionToolbarButtonDescriptor; import org.ourproject.kune.platf.client.actions.ActionToolbarButtonSeparator; import org.ourproject.kune.platf.client.actions.ActionToolbarMenuDescriptor; @@ -15,7 +14,9 @@ import org.ourproject.kune.platf.client.actions.toolbar.ActionToolbar; import org.ourproject.kune.platf.client.dto.AccessRolDTO; import org.ourproject.kune.platf.client.i18n.I18nTranslationService; +import org.ourproject.kune.platf.client.shortcuts.ActionShortcut; import org.ourproject.kune.platf.client.state.Session; +import org.ourproject.kune.platf.client.ui.TextUtils; import org.ourproject.kune.platf.client.ui.noti.NotifyUser; import org.ourproject.kune.platf.client.ui.palette.ColorWebSafePalette; import org.ourproject.kune.platf.client.ui.rte.RichTextArea; @@ -23,6 +24,7 @@ import org.ourproject.kune.platf.client.ui.rte.img.RTEImgResources; import org.ourproject.kune.platf.client.ui.rte.insertimg.InsertImageDialog; import org.ourproject.kune.platf.client.ui.rte.insertlink.InsertLinkDialog; +import org.ourproject.kune.platf.client.ui.rte.inserttable.InsertTableDialog; import org.ourproject.kune.platf.client.utils.DeferredCommandWrapper; import com.calclab.suco.client.events.Event0; @@ -66,11 +68,17 @@ private final ActionAddCondition<Object> canBeExtended; private final Provider<EditHtmlDialog> editHtmlDialog; private final Provider<InsertImageDialog> insertImageDialog; + private final Provider<InsertTableDialog> insertTableDialog; + private Listener<String> insertTableListener; + private Listener2<String, String> insertLinkListener; + private Listener<String> updateHtmlListener; + private ActionToolbarButtonDescriptor<Object> insertTableBtn; public RTEditorPresenter(I18nTranslationService i18n, Session session, RTEActionTopToolbar topBar, RTEActionSndToolbar sndBar, RTEImgResources imgResources, InsertLinkDialog textEditorInsertElement, ColorWebSafePalette palette, Provider<EditHtmlDialog> editHtmlDialog, - Provider<InsertImageDialog> insertImageDialog, DeferredCommandWrapper deferred) { + Provider<InsertImageDialog> insertImageDialog, Provider<InsertTableDialog> insertTableDialog, + DeferredCommandWrapper deferred) { this.i18n = i18n; this.session = session; this.topBar = topBar; @@ -79,6 +87,7 @@ this.palette = palette; this.editHtmlDialog = editHtmlDialog; this.insertImageDialog = insertImageDialog; + this.insertTableDialog = insertTableDialog; this.deferred = deferred; styleToolbar(sndBar); sndBar.attach(); @@ -399,14 +408,18 @@ ActionToolbarMenuDescriptor<Object> editHtml = new ActionToolbarMenuDescriptor<Object>(accessRol, topbar, new Listener0() { + public void onEvent() { + if (updateHtmlListener == null) { + updateHtmlListener = new Listener<String>() { + public void onEvent(String html) { + view.setHTML(html); + fireOnEdit(); + } + }; + } EditHtmlDialog dialog = editHtmlDialog.get(); - dialog.setUpdateListener(new Listener<String>() { - public void onEvent(String html) { - view.setHTML(html); - fireOnEdit(); - } - }); + dialog.setUpdateListener(updateHtmlListener); dialog.show(); dialog.setHtml(view.getHTML()); } @@ -558,12 +571,15 @@ public void onEvent() { deferred.addCommand(new Listener0() { public void onEvent() { - insertElement.setOnCreateLink(new Listener2<String, String>() { - public void onEvent(String name, String url) { - view.createLink(url); - fireOnEdit(); - } - }); + if (insertLinkListener == null) { + insertLinkListener = new Listener2<String, String>() { + public void onEvent(String name, String url) { + view.createLink(url); + fireOnEdit(); + } + }; + } + insertElement.setOnCreateLink(insertLinkListener); insertElement.show(); } }); @@ -599,10 +615,21 @@ removeFormat.setAddCondition(canBeExtended); removeFormat.setRightSeparator(ActionToolbarButtonSeparator.separator); + final ActionToolbarMenuDescriptor<Object> insertMedia = new ActionToolbarMenuDescriptor<Object>(accessRol, + topbar, new Listener0() { + public void onEvent() { + NotifyUser.info(TextUtils.IN_DEVELOPMENT); + } + }); + insertMedia.setIconCls(getCssName(imgResources.film())); + insertMedia.setTextDescription(i18n.t("Insert Media ...")); + insertMedia.setAddCondition(canBeExtended); + insertMedia.setParentMenuTitle(i18n.t(INSERT_MENU)); + final ActionToolbarMenuDescriptor<Object> insertTable = new ActionToolbarMenuDescriptor<Object>(accessRol, topbar, new Listener0() { public void onEvent() { - insertSimpleTable(); + onInsertTablePressed(); } }); insertTable.setIconCls(getCssName(imgResources.inserttable())); @@ -610,12 +637,11 @@ insertTable.setAddCondition(canBeExtended); insertTable.setParentMenuTitle(i18n.t(INSERT_MENU)); - final ActionToolbarButtonDescriptor<Object> insertTableBtn = new ActionToolbarButtonDescriptor<Object>( - accessRol, sndbar, new Listener0() { - public void onEvent() { - insertSimpleTable(); - } - }); + insertTableBtn = new ActionToolbarButtonDescriptor<Object>(accessRol, sndbar, new Listener0() { + public void onEvent() { + onInsertTablePressed(); + } + }); insertTableBtn.setIconCls(getCssName(imgResources.inserttable())); insertTableBtn.setToolTip(i18n.t("Insert Table")); insertTableBtn.setAddCondition(canBeExtended); @@ -624,7 +650,7 @@ final ActionToolbarButtonDescriptor<Object> fontColor = new ActionToolbarButtonDescriptor<Object>(accessRol, sndbar, new Listener0() { public void onEvent() { - palette.show(getActionLeftPosition(sndBar, removeFormat), getActionTopPosition(sndBar, + palette.show(getActionLeftPosition(sndBar, insertTableBtn), getActionTopPosition(sndBar, removeFormat), new Listener<String>() { public void onEvent(String color) { palette.hide(); @@ -710,6 +736,7 @@ actions.add(withNoItem(removeLink)); actions.add(withNoItem(insertTableBtn)); actions.add(withNoItem(insertTable)); + actions.add(withNoItem(insertMedia)); actions.add(withNoItem(comment)); actions.add(withNoItem(undoBtn)); actions.add(withNoItem(redoBtn)); @@ -772,14 +799,6 @@ return RTEImgResources.SUFFIX + imageResource.getName(); } - private void insertSimpleTable() { - view.insertHtml("<table border=\"0\" cellpadding=\"3\" cellspacing=\"0\" width=\"100%\">\n" + "<tbody>\n" - + "<tr>\n" + "<td width=\"50%\"><br>\n" + "</td>\n" + "<td width=\"50%\"><br>\n" + "</td>\n" - + "</tr>\n" + "<tr>\n" + "<td width=\"50%\"><br>\n" + "</td>\n" + "<td width=\"50%\"><br>\n" - + "</td>\n" + "</tr>\n</tbody>\n</table>"); - fireOnEdit(); - } - private boolean isExtended() { return extended && view.canBeExtended(); } @@ -792,6 +811,23 @@ }; } + private void onInsertTablePressed() { + if (insertTableListener == null) { + insertTableListener = new Listener<String>() { + public void onEvent(String table) { + if (view.isAnythingSelected()) { + // FIXME + // move to end of selection? + } + view.insertHtml(table); + fireOnEdit(); + } + }; + } + insertTableDialog.get().setOnInsertTable(insertTableListener); + insertTableDialog.get().show(); + } + private void styleToolbar(ActionToolbar<Object> bar) { bar.setNormalStyle(); } Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/RTEImgResources.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/RTEImgResources.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/RTEImgResources.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -47,6 +47,9 @@ @Resource("edithtml.png") public ImageResource edithtml(); + @Resource("film.png") + public ImageResource film(); + @Resource("fontcolor.png") public ImageResource fontcolor(); Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/film.png =================================================================== (Binary files differ) Property changes on: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/film.png ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/rteimg.css =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/rteimg.css 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/img/rteimg.css 2009-03-16 04:13:36 UTC (rev 1078) @@ -10,6 +10,10 @@ gwt-image: 'subscript'; } +@sprite div .k-rte-film { + gwt-image: 'film'; +} + @sprite div .k-rte-strikeout { gwt-image: 'strikeout'; } Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/AbstractRichTextAreaTest.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/AbstractRichTextAreaTest.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/AbstractRichTextAreaTest.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,161 @@ +/* + * See the NOTICE file distributed with this work for additional + * information regarding copyright ownership. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.ourproject.kune.platf.client.ui.rte.insertlink; + +import org.ourproject.kune.platf.client.ui.rte.RichTextArea; + +import com.google.gwt.user.client.Timer; +import com.google.gwt.user.client.ui.LoadListener; +import com.google.gwt.user.client.ui.RootPanel; +import com.google.gwt.user.client.ui.SourcesLoadEvents; +import com.google.gwt.user.client.ui.Widget; +import com.xpn.xwiki.wysiwyg.client.dom.Element; +import com.xpn.xwiki.wysiwyg.client.dom.Range; +import com.xpn.xwiki.wysiwyg.client.dom.Selection; + +/** + * Base class for tests running on a rich text area. + * + * @version $Id$ + */ +public class AbstractRichTextAreaTest extends AbstractWysiwygClientTest implements LoadListener { + /** + * The number of milliseconds we delay the test finish. This delay is needed + * because in some browsers the rich text area is initialized after a + * timeout. + */ + public static final int FINISH_DELAY = 400; + + /** + * The number of milliseconds we delay the test start. This delay is needed + * because in some browsers the rich text area is initialized after a + * timeout and we want to start the test after the rich text area is fully + * initialized. + */ + public static final int START_DELAY = 300; + + /** + * The rich text area on which we run the tests. + */ + protected RichTextArea rta; + + /** + * {@inheritDoc} + * + * @see LoadListener#onError(Widget) + */ + public void onError(Widget sender) { + // ignore + } + + /** + * {@inheritDoc} + * + * @see LoadListener#onLoad(Widget) + */ + public void onLoad(Widget sender) { + // http://wiki.codetalks.org/wiki/index.php/Docs/Keyboard_navigable_JS_widgets + // #Use_setTimeout_with_element.focus.28.29_to_set_focus + (new Timer() { + @Override + public void run() { + rta.setFocus(true); + } + }).schedule(1); + } + + /** + * Cleans the HTML input. This is needed in order to have uniform tests + * between Firefox and Internet Explorer. + * + * @param html + * The HTML fragment to be cleaned. + * @return The input string in lower case, stripped of new lines. + */ + protected String clean(String html) { + return html.replaceAll("\r\n", "").toLowerCase(); + } + + /** + * @return The body element of the DOM document edited with the rich text + * area. + */ + protected Element getBody() { + return rta.getDocument().getBody().cast(); + } + + /** + * {@inheritDoc} + * + * @see AbstractWysiwygClientTest#gwtSetUp() + */ + @Override + protected void gwtSetUp() throws Exception { + super.gwtSetUp(); + + if (rta == null) { + rta = new RichTextArea(); + // Workaround till GWT provides a way to detect when the rich text + // area has finished loading. + if (rta.getBasicFormatter() != null && rta.getBasicFormatter() instanceof SourcesLoadEvents) { + ((SourcesLoadEvents) rta.getBasicFormatter()).addLoadListener(this); + } + } + RootPanel.get().add(rta); + } + + /** + * {@inheritDoc} + * + * @see AbstractWysiwygClientTest#gwtTearDown() + */ + @Override + protected void gwtTearDown() throws Exception { + super.gwtTearDown(); + + RootPanel.get().remove(rta); + } + + /** + * Removes the non-breaking spaces, {@code }, from the given HTML. The + * is method is needed because the Selection implementation for Internet + * Explorer adds {@code } when it cannot place the caret at the + * specified place. + * + * @param html + * the HTML fragment to be cleaned of non-breaking spaces + * @return the input HTML fragment without any non-breaking spaces + */ + protected String removeNonBreakingSpaces(String html) { + return html.replace(" ", ""); + } + + /** + * Selects the given range. + * + * @param range + * The range to be selected. + */ + protected void select(Range range) { + Selection selection = rta.getDocument().getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + } +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/AbstractWysiwygClientTest.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/AbstractWysiwygClientTest.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/AbstractWysiwygClientTest.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,55 @@ +/* + * See the NOTICE file distributed with this work for additional + * information regarding copyright ownership. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.ourproject.kune.platf.client.ui.rte.insertlink; + +import com.google.gwt.dom.client.Document; +import com.google.gwt.junit.client.GWTTestCase; + +/** + * Base class for all WYSIWYG client tests. It returns the name of the module in {@link #getModuleName()} so you don't + * have to do it in each test. + * + * @version $Id$ + */ +public abstract class AbstractWysiwygClientTest extends GWTTestCase +{ + /** + * {@inheritDoc} + * + * @see GWTTestCase#getModuleName() + */ + public String getModuleName() + { + return "com.xpn.xwiki.wysiwyg.Wysiwyg"; + } + + /** + * {@inheritDoc} + * + * @see GWTTestCase#gwtSetUp() + */ + protected void gwtSetUp() throws Exception + { + super.gwtSetUp(); + + // We have to remove the default body border because it affects the range detection in IE. + Document.get().getBody().getStyle().setProperty("borderStyle", "none"); + } +} Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/LinkInfoTest.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/LinkInfoTest.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/insertlink/LinkInfoTest.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -1,14 +1,15 @@ package org.ourproject.kune.platf.client.ui.rte.insertlink; import com.allen_sauer.gwt.log.client.Log; -import com.google.gwt.junit.client.GWTTestCase; -import com.google.gwt.user.client.ui.Hyperlink; +import com.xpn.xwiki.wysiwyg.client.dom.Range; +import com.xpn.xwiki.wysiwyg.client.dom.Selection; -public class LinkInfoTest extends GWTTestCase { +public class LinkInfoTest extends AbstractRichTextAreaTest { - private static final String TEXT = "some link"; + private static final String TEXT = "somelink"; private static final String HREF = "http://example.com"; private static final String TITLE = "on over"; + private static final String _BLANK = "_blank"; @Override public String getModuleName() { @@ -16,13 +17,29 @@ } public void testSimpleLink() { - Hyperlink link = new Hyperlink(TEXT, HREF); - link.setTitle(TITLE); - Log.info(link.getHTML()); - LinkInfo linkParsed = LinkInfo.parse(link.getElement()); - assertEquals(TEXT, linkParsed.getText()); - assertEquals(HREF, linkParsed.getUrl()); - assertEquals(TITLE, linkParsed.getTitle()); - assertEquals(false, linkParsed.isInNewWindow()); + // String html = createHtmlLink(HREF, TITLE, _BLANK, TEXT); + rta.setHTML(TEXT); + Log.debug(rta.getHTML()); + + Range range = rta.getDocument().createRange(); + range.setStart(getBody().getFirstChild(), 1); + range.setEnd(getBody().getFirstChild(), 3); + String selectedText = "om"; + + Selection selection = rta.getDocument().getSelection(); + selection.removeAllRanges(); + selection.addRange(range); + assertEquals(selectedText, selection.toString()); + // + // LinkInfo linkParsed = + // LinkInfo.parse(getBody().getFirstChildElement()); + // assertEquals(TEXT, linkParsed.getText()); + // assertEquals(HREF, linkParsed.getUrl()); + // assertEquals(TITLE, linkParsed.getTitle()); + // assertEquals(false, linkParsed.isInNewWindow()); } + + private String createHtmlLink(String href, String title, String target, String text) { + return "<a title=\"" + title + "\" href=\"" + href + "\" target=\"" + target + "\">" + text + "</a>"; + } } Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialog.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialog.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialog.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,13 @@ +package org.ourproject.kune.platf.client.ui.rte.inserttable; + +import com.calclab.suco.client.events.Listener; + +public interface InsertTableDialog { + + void hide(); + + void setOnInsertTable(Listener<String> listener); + + void show(); + +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogPanel.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogPanel.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogPanel.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,185 @@ +package org.ourproject.kune.platf.client.ui.rte.inserttable; + +import org.ourproject.kune.platf.client.i18n.I18nTranslationService; +import org.ourproject.kune.platf.client.ui.TextUtils; +import org.ourproject.kune.platf.client.ui.dialogs.BasicDialog; +import org.ourproject.kune.platf.client.ui.dialogs.DefaultForm; +import org.ourproject.kune.platf.client.ui.palette.SimplePalette; + +import com.calclab.suco.client.events.Listener; +import com.calclab.suco.client.ioc.Provider; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.ui.Grid; +import com.gwtext.client.core.EventObject; +import com.gwtext.client.widgets.Button; +import com.gwtext.client.widgets.event.ButtonListenerAdapter; +import com.gwtext.client.widgets.form.Checkbox; +import com.gwtext.client.widgets.form.Field; +import com.gwtext.client.widgets.form.TextField; +import com.gwtext.client.widgets.form.event.FieldListenerAdapter; + +public class InsertTableDialogPanel extends BasicDialog implements InsertTableDialogView { + + private static final String INSERT_LINK_ID = "itdp-diag"; + private static final String R_FIELD = "itdp-wfield"; + private static final String C_FIELD = "itdp-cfield"; + private final TextField rowsField; + private final TextField colsField; + private final Checkbox sameWidth; + private final DefaultForm form; + private final TextField backColorField; + private final TextField borderField; + private final I18nTranslationService i18n; + private final TextField borderColorField; + + public InsertTableDialogPanel(final InsertTableDialogPresenter presenter, I18nTranslationService i18n, + final Provider<SimplePalette> simplePalette) { + super(INSERT_LINK_ID, i18n.t("Insert Table"), true, false, 320, 260); + this.i18n = i18n; + form = new DefaultForm(); + form.setAutoWidth(true); + form.setAutoHeight(true); + + rowsField = new TextField(); + rowsField.setTabIndex(4); + rowsField.setFieldLabel(i18n.t("Rows")); + rowsField.setWidth(DefaultForm.DEF_XSMALL_FIELD_WIDTH); + rowsField.setName(R_FIELD); + rowsField.setRegex(TextUtils.NUM_REGEXP); + rowsField.setRegexText(i18n.t("This must be a number")); + rowsField.setAllowBlank(false); + rowsField.setValidationEvent(false); + rowsField.setId(R_FIELD); + rowsField.setValue("2"); + + colsField = new TextField(); + colsField.setTabIndex(5); + colsField.setFieldLabel(i18n.t("Columns")); + colsField.setName(C_FIELD); + colsField.setWidth(DefaultForm.DEF_XSMALL_FIELD_WIDTH); + colsField.setRegex(TextUtils.NUM_REGEXP); + colsField.setRegexText(i18n.t("This must be a number")); + colsField.setAllowBlank(false); + colsField.setValidationEvent(false); + colsField.setId(C_FIELD); + colsField.setValue("2"); + + borderField = new TextField(); + borderField.setTabIndex(5); + borderField.setFieldLabel(i18n.t("Border Size")); + borderField.setWidth(DefaultForm.DEF_XSMALL_FIELD_WIDTH); + borderField.setRegex(TextUtils.NUM_REGEXP); + borderField.setRegexText(i18n.t("This must be a number")); + borderField.setAllowBlank(false); + borderField.setValidationEvent(false); + borderField.setValue("0"); + + sameWidth = new Checkbox(i18n.t("Columns of equal width")); + sameWidth.setChecked(true); + + backColorField = createColorField(i18n.t("Background color")); + borderColorField = createColorField(i18n.t("Border color")); + + FieldListenerAdapter colorListener = new FieldListenerAdapter() { + @Override + public void onFocus(final Field field) { + super.onFocus(field); + simplePalette.get().show(field.getAbsoluteLeft() + 10, field.getAbsoluteTop() + 10, + new Listener<String>() { + public void onEvent(String color) { + setBackgroupFieldColor(field, color); + field.setValue("#" + color); + } + }); + } + }; + backColorField.addListener(colorListener); + borderColorField.addListener(colorListener); + + form.add(rowsField); + form.add(colsField); + form.add(sameWidth); + form.add(backColorField); + form.add(borderField); + form.add(borderColorField); + + Button insert = new Button(i18n.t("Insert")); + insert.addListener(new ButtonListenerAdapter() { + @Override + public void onClick(Button button, EventObject e) { + if (form.getFormPanel().getForm().isValid()) { + presenter.onInsert(rowsField.getValueAsString(), colsField.getValueAsString(), + borderField.getValueAsString()); + } + } + }); + Button cancel = new Button(i18n.t("Cancel")); + cancel.addListener(new ButtonListenerAdapter() { + @Override + public void onClick(Button button, EventObject e) { + presenter.onCancel(); + } + }); + + super.add(form.getFormPanel()); + super.addButton(insert); + super.addButton(cancel); + } + + public String generateTable(int rows, int cols, boolean sameColWidth, String backgroundColor, int border, + String borderColor) { + Grid table = new Grid(rows, cols); + table.setWidth("100%"); + if (backgroundColor != null) { + DOM.setElementAttribute(table.getElement(), "bgcolor", backgroundColor); + } + + if (borderColor != null) { + DOM.setElementAttribute(table.getElement(), "bordercolor", borderColor); + } + + table.setBorderWidth(border); + table.setCellPadding(3); + table.setCellSpacing(0); + if (sameColWidth) { + int colWith = 100 / cols; + for (int i = 0; i < cols; i++) { + table.getColumnFormatter().setWidth(i, colWith + "%"); + } + } + return table.getElement().getString(); + } + + public String getBackgroundColor() { + return backColorField.getValueAsString(); + } + + public String getBorderColor() { + return borderColorField.getValueAsString(); + } + + public boolean getSameColWidth() { + return sameWidth.getValue(); + } + + public void reset() { + form.getFormPanel().getForm().reset(); + rowsField.setValue("2"); + colsField.setValue("2"); + borderField.setValue("0"); + sameWidth.setChecked(true); + setBackgroupFieldColor(backColorField, "FFFFFF"); + setBackgroupFieldColor(borderColorField, "FFFFFF"); + } + + private TextField createColorField(String text) { + TextField field = new TextField(text); + field.setWidth(DefaultForm.DEF_XSMALL_FIELD_WIDTH + 15); + field.setTitle(i18n.t("Click to change")); + return field; + } + + private void setBackgroupFieldColor(Field field, String color) { + field.setStyle("background-color: #" + color + ";background-image:none;"); + } +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogPresenter.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogPresenter.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,56 @@ +package org.ourproject.kune.platf.client.ui.rte.inserttable; + +import com.calclab.suco.client.events.Listener; + +public class InsertTableDialogPresenter implements InsertTableDialog { + + private static final int MAX_ROWS = 100; + private static final int MAX_COLS = 25; + private static final int MAX_BORDER = 50; + private InsertTableDialogView view; + private Listener<String> onInsertTable; + + public InsertTableDialogPresenter() { + } + + public void hide() { + view.hide(); + } + + public void init(InsertTableDialogView view) { + this.view = view; + } + + public void onCancel() { + view.hide(); + view.reset(); + } + + public void onInsert(String rowsS, String colsS, String borderS) { + if (onInsertTable != null) { + Integer rows = new Integer(rowsS); + Integer cols = new Integer(colsS); + Integer border = new Integer(borderS); + boolean validRows = rows < MAX_ROWS && rows > 0; + boolean validCols = cols < MAX_COLS && cols > 0; + boolean validBorder = border < MAX_BORDER && border > 0; + onInsertTable.onEvent(createTable(validRows ? rows : MAX_ROWS, validCols ? cols : MAX_COLS, + validBorder ? border : MAX_BORDER)); + } + view.hide(); + view.reset(); + } + + public void setOnInsertTable(Listener<String> listener) { + this.onInsertTable = listener; + } + + public void show() { + view.show(); + } + + private String createTable(int rows, int cols, int border) { + return view.generateTable(rows, cols, view.getSameColWidth(), view.getBackgroundColor(), border, + view.getBorderColor()); + } +} Added: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogView.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogView.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/inserttable/InsertTableDialogView.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -0,0 +1,21 @@ +package org.ourproject.kune.platf.client.ui.rte.inserttable; + +import org.ourproject.kune.platf.client.View; + +public interface InsertTableDialogView extends View { + + String generateTable(int rows, int cols, boolean sameColWidth, String backgroundColor, int border, + String borderColor); + + String getBackgroundColor(); + + String getBorderColor(); + + boolean getSameColWidth(); + + void hide(); + + void reset(); + + void show(); +} Modified: trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/saving/RTESavingEditorPresenter.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/saving/RTESavingEditorPresenter.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/platf/client/ui/rte/saving/RTESavingEditorPresenter.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -1,12 +1,12 @@ package org.ourproject.kune.platf.client.ui.rte.saving; -import org.ourproject.kune.platf.client.actions.ActionShortcut; import org.ourproject.kune.platf.client.actions.ActionToolbarButtonDescriptor; import org.ourproject.kune.platf.client.actions.ActionToolbarButtonSeparator; import org.ourproject.kune.platf.client.actions.ActionToolbarMenuDescriptor; import org.ourproject.kune.platf.client.actions.BeforeActionListener; import org.ourproject.kune.platf.client.dto.AccessRolDTO; import org.ourproject.kune.platf.client.i18n.I18nTranslationService; +import org.ourproject.kune.platf.client.shortcuts.ActionShortcut; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.ui.rte.basic.RTEditor; import org.ourproject.kune.platf.client.ui.rte.img.RTEImgResources; Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/AbstractFoldableContentActions.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/AbstractFoldableContentActions.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/AbstractFoldableContentActions.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -468,7 +468,7 @@ }); action.setTextDescription(textDescription); action.setParentMenuTitle(PUBLICATION_MENU); - // action.setParentSubMenuTitle(i18n.t("Change the status")); + action.setParentMenuIconUrl("images/anybody.png"); contentActionRegistry.addAction(action, contentsModerated); } Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/WorkspaceModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/WorkspaceModule.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/WorkspaceModule.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -42,6 +42,7 @@ import org.ourproject.kune.platf.client.services.ErrorHandler; import org.ourproject.kune.platf.client.services.ImageUtils; import org.ourproject.kune.platf.client.services.Images; +import org.ourproject.kune.platf.client.shortcuts.GlobalShortcutRegister; import org.ourproject.kune.platf.client.state.Session; import org.ourproject.kune.platf.client.state.StateManager; import org.ourproject.kune.platf.client.ui.download.FileDownloadUtils; @@ -82,7 +83,6 @@ import org.ourproject.kune.workspace.client.entityheader.maxmin.MaxMinWorkspace; import org.ourproject.kune.workspace.client.entityheader.maxmin.MaxMinWorkspacePanel; import org.ourproject.kune.workspace.client.entityheader.maxmin.MaxMinWorkspacePresenter; -import org.ourproject.kune.workspace.client.events.GlobalShortcutRegister; import org.ourproject.kune.workspace.client.i18n.I18nTranslator; import org.ourproject.kune.workspace.client.i18n.I18nTranslatorPanel; import org.ourproject.kune.workspace.client.i18n.I18nTranslatorPresenter; Deleted: trunk/src/main/java/org/ourproject/kune/workspace/client/events/GlobalShortcutRegister.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/events/GlobalShortcutRegister.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/events/GlobalShortcutRegister.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -1,38 +0,0 @@ -package org.ourproject.kune.workspace.client.events; - -import org.ourproject.kune.platf.client.actions.ActionItem; -import org.ourproject.kune.platf.client.actions.ActionManager; -import org.ourproject.kune.platf.client.actions.ActionShortcutRegister; - -import com.google.gwt.user.client.DOM; -import com.google.gwt.user.client.Event; -import com.google.gwt.user.client.EventPreview; - -public class GlobalShortcutRegister extends ActionShortcutRegister { - - private final EventPreview eventPreview; - - public GlobalShortcutRegister(final ActionManager actionManager) { - eventPreview = new EventPreview() { - @SuppressWarnings("unchecked") - public boolean onEventPreview(Event event) { - ActionItem actionItem = get(event); - if (actionItem != null) { - // Log.debug("Not propagating event"); - DOM.eventPreventDefault(event); - actionManager.doAction(actionItem); - return false; - } - return true; - } - }; - } - - public void disable() { - DOM.removeEventPreview(eventPreview); - } - - public void enable() { - DOM.addEventPreview(eventPreview); - } -} Modified: trunk/src/main/java/org/ourproject/kune/workspace/client/hello/HelloWorldModule.java =================================================================== --- trunk/src/main/java/org/ourproject/kune/workspace/client/hello/HelloWorldModule.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/main/java/org/ourproject/kune/workspace/client/hello/HelloWorldModule.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -20,15 +20,15 @@ package org.ourproject.kune.workspace.client.hello; import org.ourproject.kune.platf.client.View; -import org.ourproject.kune.platf.client.actions.ActionShortcut; import org.ourproject.kune.platf.client.actions.ActionToolbarMenuDescriptor; import org.ourproject.kune.platf.client.dto.AccessRolDTO; import org.ourproject.kune.platf.client.dto.UserSimpleDTO; import org.ourproject.kune.platf.client.i18n.I18nTranslationService; import org.ourproject.kune.platf.client.i18n.I18nTranslationServiceMocked; +import org.ourproject.kune.platf.client.shortcuts.ActionShortcut; +import org.ourproject.kune.platf.client.shortcuts.GlobalShortcutRegister; import org.ourproject.kune.platf.client.ui.noti.NotifyUser; import org.ourproject.kune.workspace.client.AbstractFoldableContentActions; -import org.ourproject.kune.workspace.client.events.GlobalShortcutRegister; import org.ourproject.kune.workspace.client.skel.WorkspaceSkeleton; import org.ourproject.kune.workspace.client.socialnet.UserActionRegistry; Modified: trunk/src/test/java/org/ourproject/kune/platf/client/actions/ActionShortcutTest.java =================================================================== --- trunk/src/test/java/org/ourproject/kune/platf/client/actions/ActionShortcutTest.java 2009-03-15 18:00:13 UTC (rev 1077) +++ trunk/src/test/java/org/ourproject/kune/platf/client/actions/ActionShortcutTest.java 2009-03-16 04:13:36 UTC (rev 1078) @@ -5,6 +5,7 @@ import org.junit.Before; import org.junit.Test; +import org.ourproject.kune.platf.client.shortcuts.ActionShortcut; import com.google.gwt.user.client.ui.KeyboardListener;
participants (1)
-
vjrj