Merge branch 'palette-browser' into 'master' 39/18839/1
Paul Bignier [Wed, 4 Jan 2017 16:44:47 +0000 (17:44 +0100)]
Change-Id: Ib2b127d8fdca5aaf9f2a8e55aeefce61f91594df

25 files changed:
1  2 
git_hooks/pre-commit
scilab/CHANGES.md
scilab/build.qa.incl.xml
scilab/configure
scilab/modules/api_scilab/Makefile.in
scilab/modules/functions/Makefile.in
scilab/modules/graphics/Makefile.in
scilab/modules/gui/Makefile.in
scilab/modules/history_browser/Makefile.in
scilab/modules/io/Makefile.in
scilab/modules/jvm/Makefile.in
scilab/modules/mpi/Makefile.in
scilab/modules/polynomials/Makefile.in
scilab/modules/randlib/Makefile.in
scilab/modules/scicos/Makefile.in
scilab/modules/tclsci/Makefile.in
scilab/modules/ui_data/Makefile.in
scilab/modules/xcos/Makefile.in
scilab/modules/xcos/etc/palettes.xml
scilab/modules/xcos/src/java/org/scilab/modules/xcos/graph/XcosDiagram.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/palette/PaletteBlockCtrl.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/palette/PaletteCtrl.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/palette/view/PaletteManagerPanel.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/BlockPositioning.java
scilab/modules/xcos/src/java/org/scilab/modules/xcos/utils/XcosMessages.java

Simple merge
@@@ -242,17 -177,17 +242,26 @@@ Data Structure
  Xcos
  ----
  
 -* Major rewrite of the data structures, huge models should load and save faster. The memory usage on diagram edition is also slightly reduced.
 -* Implicit fixed-size step ODE solver added: Crank-Nicolson 2(3). Added to the CVode package, it also benefits from the CVode rootfinding feature.
 +* Major rewrite of the data structures, huge models should load and save faster.
 +The memory usage on diagram edition is also slightly reduced.
 +* ZCOS and XCOS file formats have evolved to reduce the duplicated information.
 +Scilab 5.5.2 is able to open the newly saved files, but the ports have to be repositioned manually.
 +* Implicit fixed-size step ODE solver added: Crank-Nicolson 2(3).
 +Added to the CVode package, it also benefits from the CVode rootfinding feature.
 +* Added a new link style (`Optimal`) for automatically finding the optimal route.
 +* Automatically reposition split blocks for better-looking layout.
 +* Block modifications :
 +  - `INVBLK`: add a divide by zero parameter to ignore the error
 +  - `PRODUCT`: add a divide by zero parameter to ignore the error
+ * The palette browser has been improved. The following features were included:
+   - search engine
+   - history (go forward or backward)
+   - drag and drop multiple blocks at once
+   - navigate using the keyboard arrows
+   - add blocks to the most recent diagram by using the ENTER key
+   - dynamic palette with the last used blocks
+   - zoom using CTRL(+), CTRL(-) and CTRL(mousewheel)
+   - load SVG icons
  
  
  API modification
@@@ -280,8 -207,8 +289,9 @@@ Obsolete functions or feature
  * `isoview(xmin,xmax,ymin,ymax)` is deprecated. Please use `isoview("on"), replot(..)` instead.
  * `eval3d` will be removed from Scilab 6.1. Please use `ndgrid` instead.
  * `strcmpi` is deprecated. Please use `strcmp(..,"i")`instead.
 +* `square` will be removed from Scilab 6.1. Please use `gcf().axes_size` and `replot` instead.
  
  Removed Functions
  -----------------
  
@@@ -321,114 -245,44 +331,118 @@@ the [development mailing list](dev@list
  Bug Fixes
  ---------
  
 -### In 6.0.0:
 -* [Bug #5723](http://bugzilla.scilab.org/show_bug.cgi?id=5723) fixed   - Cross-references were missing between axis_properties and axes_properties help pages
 -* [Bug #7696](http://bugzilla.scilab.org/show_bug.cgi?id=7696) fixed - The `parallel_run` help page was poorly formated
 -* [Bug #9912](http://bugzilla.scilab.org/show_bug.cgi?id=9912) fixed   - In case of missing translated help page, the default en_US was sometimes ignored
 -* [Bug #9153](http://bugzilla.scilab.org/9153) fixed   - The `isqualbitwise` help page was inaccurate and badly located
 -* [Bug #9288](http://bugzilla.scilab.org/show_bug.cgi?id=9288) fixed - Dynamic palette with the most used blocks
 -* [Bug #10326](http://bugzilla.scilab.org/show_bug.cgi?id=10326) fixed - Adds a search engine for the palette browser.
 -* [Bug #11959](http://bugzilla.scilab.org/show_bug.cgi?id=11959) fixed - Allow "Zoom Area" to be clicked out of axes
 -* [Bug #12110](http://bugzilla.scilab.org/show_bug.cgi?id=12110) fixed - Unable to zoom multiple axes at once
 -* [Bug #12453](http://bugzilla.scilab.org/show_bug.cgi?id=12453) fixed - The left panel of the palette browser keeps its size when some category is enabled or disabled.
 -* [Bug #13597](http://bugzilla.scilab.org/show_bug.cgi?id=13597) fixed - `help format` claimed setting a number of digits instead of characters
 -* [Bug #13757](http://bugzilla.scilab.org/show_bug.cgi?id=13757) fixed - The toolbox menu dit not load properly ATOMS modules not autoloaded.
 -* [Bug #13906](http://bugzilla.scilab.org/show_bug.cgi?id=13906) fixed - It is now possible to navigate through the Palette browser with the arrow keys.
 -* [Bug #13990](http://bugzilla.scilab.org/show_bug.cgi?id=13990) fixed - `warning` with localization enabled some memory corruption
 -* [Bug #14192](http://bugzilla.scilab.org/show_bug.cgi?id=14192) fixed - `g_margin` error-ed for double integrator.
 -* [Bug #14367](http://bugzilla.scilab.org/show_bug.cgi?id=14367) fixed - `edit_curv` failed opening due to a `[]+1` operation.
 -* [Bug #14448](http://bugzilla.scilab.org/show_bug.cgi?id=14448) fixed - removed havewindow() was still documented
 -* [Bug #14557](http://bugzilla.scilab.org/show_bug.cgi?id=14557) fixed - `csim` failed when the system has no state.
 -* [Bug #14582](http://bugzilla.scilab.org/14582) fixed   - `gettext`or it alias `_()` were sometimes applied to broken literal strings
 -* [Bug #14586](http://bugzilla.scilab.org/show_bug.cgi?id=14586) fixed - Xcos simulation stop button did not work.
 -* [Bug #14587](http://bugzilla.scilab.org/show_bug.cgi?id=14587) fixed - Datatip textbox wrong clipping when loaded from `*.scg` file.
 -* [Bug #14590](http://bugzilla.scilab.org/show_bug.cgi?id=14590) fixed - Help pages in pt_BR directories had a wrong xml:lang="en" tag.
 -* [Bug #14593](http://bugzilla.scilab.org/show_bug.cgi?id=14593) fixed - Signs are no more drawn in BIGSOM and PRODUCT components.
 -* [Bug #14602](http://bugzilla.scilab.org/show_bug.cgi?id=14662) fixed - WRITEC_f block didn't work for x86 machines.
 -* [Bug #14648](http://bugzilla.scilab.org/show_bug.cgi?id=14648) fixed - `isinf` returned `%F` for complex numbers with both real and imag infinite parts.
 -* [Bug #14662](http://bugzilla.scilab.org/show_bug.cgi?id=14662) fixed - Matrix of strings concatenation with single quote led to a parser error.
 -* [Bug #14681](http://bugzilla.scilab.org/show_bug.cgi?id=14681) fixed - Short-circuited AND operation was not possible with double matrices in if and while clauses
 -
 -### In 6.0.0 beta-2 and earlier:
 -
 -* [Bug #2104](http://bugzilla.scilab.org/show_bug.cgi?id=2104) fixed   - `iw(1:9)` and `w(1:10)` `ode` output parameters were not documented
 -* [Bug #2517](http://bugzilla.scilab.org/show_bug.cgi?id=2517) fixed   - `"position"` property format was not accepted by `figure` despite what was said in help
 -* [Bug #6057](http://bugzilla.scilab.org/show_bug.cgi?id=6057) fixed  - trailing space after minus sign has been removed from the display of values
 -* [Bug #6064](http://bugzilla.scilab.org/show_bug.cgi?id=6064) fixed - `scatter` did not exist in Scilab.
 -* [Bug #6314](http://bugzilla.scilab.org/show_bug.cgi?id=6314) fixed   - The identical code of `%p_m_r` and `%r_m_p` was not factorized
 -* [Bug #7378](http://bugzilla.scilab.org/show_bug.cgi?id=7378) fixed   - `quart` used with only `NaN`s yielded an error instead of returning `NaN`.
 -* [Bug #7646](http://bugzilla.scilab.org/show_bug.cgi?id=7646) fixed   - Extractions `A'(1,2)` and `A.'(1,2)` from a transposed matrix were not possible
 -* [Bug #7884](http://bugzilla.scilab.org/show_bug.cgi?id=7884) fixed   - `typeof` help page was poor, puzzled, and not up-to-date to Scilab 6:
 +### Bugs fixed in 6.0.0:
 +* [#592](http://bugzilla.scilab.org/show_bug.cgi?id=592): `linspace(a, b, n<=0)` returned `b` instead of `[]`
 +* [#2919](http://bugzilla.scilab.org/show_bug.cgi?id=2919): The `fchamp` example and demo were unclear and badly rendered
 +* [#4327](http://bugzilla.scilab.org/show_bug.cgi?id=4327): Overloading did not support custom types names longer than 8 characters
 +* [#5723](http://bugzilla.scilab.org/show_bug.cgi?id=5723): Cross-references were missing between axis_properties and axes_properties help pages
 +* [#7192](http://bugzilla.scilab.org/show_bug.cgi?id=7192): From S=[], S($+1,:) = some_row inserted it in row#2 after a parasitic row#1.
 +* [#7649](http://bugzilla.scilab.org/show_bug.cgi?id=7649): `isempty` returned `%F` on `struct()`, `{}` or `list(,)` and was not shortcut
 +* [#7696](http://bugzilla.scilab.org/show_bug.cgi?id=7696): The `parallel_run` help page was poorly formated
 +* [#7794](http://bugzilla.scilab.org/show_bug.cgi?id=7794): Example of findABCD help page failed.
 +* [#7958](http://bugzilla.scilab.org/show_bug.cgi?id=7958): `mrfit`did not allow a fourth parameter as shown in the help page.
 +* [#8010](http://bugzilla.scilab.org/show_bug.cgi?id=8010): Permanent variables could be redefined through a syntax like `%i(1,1)=1`
 +* [#8190](http://bugzilla.scilab.org/show_bug.cgi?id=8190): Fixed ICSE demos of Optimization module.
 +* [#8356](http://bugzilla.scilab.org/show_bug.cgi?id=8356): `sci2exp` applied to lists, tlists or mlists having undefined fields yielded an error or a wrong result.
 +* [#8493](http://bugzilla.scilab.org/show_bug.cgi?id=8493): Some trivial simplifications of `p1./p2` with matrices of complex-encoded polynomials were not done.
 +* [#8841](http://bugzilla.scilab.org/show_bug.cgi?id=8841): Error in struct extraction, s.a is not equal to s(1).a
 +* [#8938](http://bugzilla.scilab.org/show_bug.cgi?id=8938): In a boolean sparse matrix `sp`, distributive insertions like `sp(1,:)=%t`, `sp(1,1:$)=%t` or `sp(:,:)=%t` yielded an error.
 +* [#9008](http://bugzilla.scilab.org/show_bug.cgi?id=9008): `test_run` applied the `create_ref` option even for tests having the `<-- NO CHECK REF -->` flag.
 +* [#9153](http://bugzilla.scilab.org/show_bug.cgi?id=9153): The `isqualbitwise` help page was inaccurate and badly located
 +* [#9161](http://bugzilla.scilab.org/show_bug.cgi?id=9161): Multiple insertions at a repeated index in a sparse matrice wrongly updated it.
++* [#9288](http://bugzilla.scilab.org/show_bug.cgi?id=9288): Dynamic palette with the most used blocks
 +* [#9865](http://bugzilla.scilab.org/show_bug.cgi?id=9865): When making a plot with `point`(no line), no symbol was shown in the legend.
 +* [#9876](http://bugzilla.scilab.org/show_bug.cgi?id=9876): Creating a complex structure with multiple hierarchy level and size failed.
 +* [#9912](http://bugzilla.scilab.org/show_bug.cgi?id=9912): In case of missing translated help page, the default en_US was sometimes ignored
 +* [#10116](http://bugzilla.scilab.org/show_bug.cgi?id=10116): `for h = H, .., end` could not be used when H is a vector of graphic handles
 +* [#10195](http://bugzilla.scilab.org/show_bug.cgi?id=10195): `execstr` interpreted ascii(0) to ascii(31) characters as the power `^` operator.
- * [#10981](http://bugzilla.scilab.org/show_bug.cgi?id=10981):  When the view property of Axes object is set at 2d, the rotation becomes impossible.
++* [#10326](http://bugzilla.scilab.org/show_bug.cgi?id=10326): Adds a search engine for the palette browser.
++* [#10981](http://bugzilla.scilab.org/show_bug.cgi?id=10981): When the view property of Axes object is set at 2d, the rotation becomes impossible.
 +* [#11375](http://bugzilla.scilab.org/show_bug.cgi?id=11375): When a localized help subdirectory has only a CHAPTER file specifying the section title, it was ignored.
 +* [#11692](http://bugzilla.scilab.org/show_bug.cgi?id=11692): The summary of a help section built from both default en_US and localized files was never sorted overall.
 +* [#11959](http://bugzilla.scilab.org/show_bug.cgi?id=11959): Allow "Zoom Area" to be clicked out of axes
 +* [#12017](http://bugzilla.scilab.org/show_bug.cgi?id=12017): `figure.pixel_drawing_mode` is ignored for filled regular polygons and other shapes, still does not work for vectorial export (eps, pdf, etc).
 +* [#12110](http://bugzilla.scilab.org/show_bug.cgi?id=12110): Unable to zoom multiple axes at once
 +* [#12431](http://bugzilla.scilab.org/show_bug.cgi?id=12431): The page describing the `%helps` variable needed clarification.
++* [#12453](http://bugzilla.scilab.org/show_bug.cgi?id=12453): The left panel of the palette browser keeps its size when some category is enabled or disabled.
 +* [#12897](http://bugzilla.scilab.org/show_bug.cgi?id=12897): Renamed optim's "imp" argument to "iprint".
 +* [#13794](http://bugzilla.scilab.org/show_bug.cgi?id=13794): Added polyline property "datatip_display_mode", allowing datatips to be displayed "always", "mouseclick" or "mouseover".
 +* [#13166](http://bugzilla.scilab.org/show_bug.cgi?id=13166): `l` and `b` endian flags used with `mget` and `mgeti` were sticky
 +* [#13375](http://bugzilla.scilab.org/show_bug.cgi?id=13375): If (Max - Min) == 1, then the multiple selection is not allowed.
 +* [#13583](http://bugzilla.scilab.org/show_bug.cgi?id=13583): `getd` loading a script including a `clear` instruction yielded an error
 +* [#13597](http://bugzilla.scilab.org/show_bug.cgi?id=13597): `help format` claimed setting a number of digits instead of characters
 +* [#13613](http://bugzilla.scilab.org/show_bug.cgi?id=13613): `isdef(name, 'l')` produced wrong output.
 +* [#13620](http://bugzilla.scilab.org/show_bug.cgi?id=13620): `dos` called with a vector as input crashed.
 +* [#13651](http://bugzilla.scilab.org/show_bug.cgi?id=13651): It was not possible to `copy` an axes into an uicontrol frame.
 +* [#13757](http://bugzilla.scilab.org/show_bug.cgi?id=13757): The toolbox menu dit not load properly ATOMS modules not autoloaded.
 +* [#13856](http://bugzilla.scilab.org/show_bug.cgi?id=13856): `messagebox` crashed under Windows in 5.5 Scilab version and updated in version 6.
 +* [#13877](http://bugzilla.scilab.org/show_bug.cgi?id=13877): `<` characters included in `<screen>` areas were not rendered in the help browser.
 +* [#13878](http://bugzilla.scilab.org/show_bug.cgi?id=13878): tokens([]) returns [].
 +* [#13895](http://bugzilla.scilab.org/show_bug.cgi?id=13895): p.a.h = 1; p.b.h = 3; p(:).h  CRASH
++* [#13906](http://bugzilla.scilab.org/show_bug.cgi?id=13906): It is now possible to navigate through the Palette browser with the arrow keys.
 +* [#13990](http://bugzilla.scilab.org/show_bug.cgi?id=13990): `warning` with localization enabled some memory corruption
 +* [#14192](http://bugzilla.scilab.org/show_bug.cgi?id=14192): `g_margin` error-ed for double integrator.
 +* [#14306](http://bugzilla.scilab.org/show_bug.cgi?id=14306): Comparisons `>` and `>=` between integers of mismatching inttypes were not implemented.
 +* [#14367](http://bugzilla.scilab.org/show_bug.cgi?id=14367): `edit_curv` failed opening due to a `[]+1` operation.
 +* [#14379](http://bugzilla.scilab.org/show_bug.cgi?id=14379): Problem with lists of functions having 2 arguments.
 +* [#14395](http://bugzilla.scilab.org/show_bug.cgi?id=14395): `dir` displayed a []+".." warning when no subdirectory exists.
 +* [#14411](http://bugzilla.scilab.org/show_bug.cgi?id=14411): abort crashes scilab in a loop while
 +* [#14437](http://bugzilla.scilab.org/show_bug.cgi?id=14437): Problem with the affectation cmde "=" applied to a "list of struct"
 +* [#14448](http://bugzilla.scilab.org/show_bug.cgi?id=14448): removed havewindow() was still documented
 +* [#14461](http://bugzilla.scilab.org/show_bug.cgi?id=14461): Calling `grand(n, "markov", P, x0)` did not return all outputs.
 +* [#14470](http://bugzilla.scilab.org/show_bug.cgi?id=14470): `geomean` often overflowed for easily computable entries, and did not check input arguments.
 +* [#14513](http://bugzilla.scilab.org/show_bug.cgi?id=14513): `isqual` comparing two built-in functions yielded an error.
 +* [#14527](http://bugzilla.scilab.org/show_bug.cgi?id=14527): Calling pathconvert function without parameters crashed Scilab.
 +* [#14553](http://bugzilla.scilab.org/show_bug.cgi?id=14553): find(a=b) crashed Scilab.
 +* [#14557](http://bugzilla.scilab.org/show_bug.cgi?id=14557): `csim` failed when the system has no state.
 +* [#14558](http://bugzilla.scilab.org/show_bug.cgi?id=14558): fixed - `square` was poor, clumsy and too specific. It is tagged as obsolete.
 +* [#14564](http://bugzilla.scilab.org/show_bug.cgi?id=14564): fieldnames failed for empty structs.
 +* [#14571](http://bugzilla.scilab.org/show_bug.cgi?id=14571): The type of input argument of `figure`function was not checked.
 +* [#14578](http://bugzilla.scilab.org/show_bug.cgi?id=14578): LaTeX string used for text uicontrol was not updated.
 +* [#14582](http://bugzilla.scilab.org/show_bug.cgi?id=14582): `gettext`or it alias `_()` were sometimes applied to broken literal strings
 +* [#14586](http://bugzilla.scilab.org/show_bug.cgi?id=14586): Xcos simulation stop button did not work.
 +* [#14587](http://bugzilla.scilab.org/show_bug.cgi?id=14587): Datatip textbox wrong clipping when loaded from `*.scg` file.
 +* [#14590](http://bugzilla.scilab.org/show_bug.cgi?id=14590): Help pages in pt_BR directories had a wrong xml:lang="en" tag.
 +* [#14591](http://bugzilla.scilab.org/show_bug.cgi?id=14591): `<=` and `>=` elementwise operators comparing 2 hypermatrices of decimal numbers or encoded integers were inverted.
 +* [#14593](http://bugzilla.scilab.org/show_bug.cgi?id=14593): Signs are no more drawn in BIGSOM and PRODUCT components.
 +* [#14602](http://bugzilla.scilab.org/show_bug.cgi?id=14602): WRITEC_f block didn't work for x86 machines.
 +* [#14632](http://bugzilla.scilab.org/show_bug.cgi?id=14632): Zooming moves drawn axis offscreen
 +* [#14640](http://bugzilla.scilab.org/show_bug.cgi?id=14640): `median(int8([10 60 80 100]))` returned -58 instead of 70 due to overflow when interpolating (60+80)>128
 +* [#14648](http://bugzilla.scilab.org/show_bug.cgi?id=14648): `isinf` returned `%F` for complex numbers with both real and imag infinite parts.
 +* [#14649](http://bugzilla.scilab.org/show_bug.cgi?id=14649): `isnan(complex(%inf, %inf))` returned `%F` while the phase is `NaN`.
 +* [#14654](http://bugzilla.scilab.org/show_bug.cgi?id=14654): `bitor`, `bitxor` and `bitand` did not accept positive inputs of type `int8`, `int16`, `int32`, `int64` or `uint64`
 +* [#14662](http://bugzilla.scilab.org/show_bug.cgi?id=14662): Matrix of strings concatenation with single quote led to a parser error.
 +* [#14667](http://bugzilla.scilab.org/show_bug.cgi?id=14667): Multi line string without final quote generated a non terminal parser state.
 +* [#14681](http://bugzilla.scilab.org/show_bug.cgi?id=14681): Short-circuited AND operation was not possible with double matrices in if and while clauses
 +* [#14689](http://bugzilla.scilab.org/show_bug.cgi?id=14689): fixed - `resize_matrix(rand(2,3),[0 2])` did not return []. Usage of new sizes <0 to keep them unchanged was not documented.
 +* [#14690](http://bugzilla.scilab.org/show_bug.cgi?id=14690): The user's startup files set in the working directory were not executed. When `SCIHOME` is not the working directory, `SCIHOME\scilab.ini` was executed twice.
 +* [#14692](http://bugzilla.scilab.org/show_bug.cgi?id=14692): isequal() was always returning true for builtin functions
 +* [#14694](http://bugzilla.scilab.org/show_bug.cgi?id=14694): The list of named colors was misaligned and poorly rendered in `help color_list`
 +* [#14710](http://bugzilla.scilab.org/show_bug.cgi?id=14710): fullpath(TMPDIR+...) was bugged on MacOS
 +* [#14714](http://bugzilla.scilab.org/show_bug.cgi?id=14714): Crash/Leak when deleting datatip
 +* [#14743](http://bugzilla.scilab.org/show_bug.cgi?id=14743): `test_run(.., "show_error")` did not document "failed: Slave Scilab exited with error code #" errors.
 +* [#14758](http://bugzilla.scilab.org/show_bug.cgi?id=14758): xstringb creates a figure when no exists.
 +* [#14779](http://bugzilla.scilab.org/show_bug.cgi?id=14779): When used logarithmic mode using coordinates <=0, xsegs crashed Scilab.
 +* [#14784](http://bugzilla.scilab.org/show_bug.cgi?id=14784): Setting field of graphics handle using children($) failed.
 +* [#14796](http://bugzilla.scilab.org/show_bug.cgi?id=14796): `ind2sub(dims, [])` returned [] in version 6. Warnings due to a `[]+1` operation occurred
 +* [#14775](http://bugzilla.scilab.org/show_bug.cgi?id=14775): Loading empty (0 bytes) .sod File crashed scilab
 +* [#14808](http://bugzilla.scilab.org/show_bug.cgi?id=14808): E=[ 'A' 'B' 'C' 'D' 'E']  ,  E(0:0) Crash Scilab Console
 +* [#14821](http://bugzilla.scilab.org/show_bug.cgi?id=14821): `getio` function was missing. An error on the diary file opened has been corrected
 +* [#14824](http://bugzilla.scilab.org/show_bug.cgi?id=14824): Incorrect error message with `mfprintf(fd, "%d", [])`.
 +* [#14839](http://bugzilla.scilab.org/show_bug.cgi?id=14839): `plot2d2` crashed Scilab.
 +* [#14887](http://bugzilla.scilab.org/show_bug.cgi?id=14887): For many graphic handle types, the display of the `.tag` value missed `".."` delimiters
 +* [#14909](http://bugzilla.scilab.org/show_bug.cgi?id=14909): getlongpathname and getshortpathname return values with "\" instead of "/"
 +
 +### Bugs fixed in 6.0.0 beta-2 and earlier 6.0.0 pre-releases:
 +
 +* [#2104](http://bugzilla.scilab.org/show_bug.cgi?id=2104): `iw(1:9)` and `w(1:10)` `ode` output parameters were not documented
 +* [#2517](http://bugzilla.scilab.org/show_bug.cgi?id=2517): `"position"` property format was not accepted by `figure` despite what was said in help
 +* [#6057](http://bugzilla.scilab.org/show_bug.cgi?id=6057): trailing space after minus sign has been removed from the display of values
 +* [#6064](http://bugzilla.scilab.org/show_bug.cgi?id=6064): `scatter` did not exist in Scilab.
 +* [#6314](http://bugzilla.scilab.org/show_bug.cgi?id=6314): The identical code of `%p_m_r` and `%r_m_p` was not factorized
 +* [#7378](http://bugzilla.scilab.org/show_bug.cgi?id=7378): `quart` used with only `NaN`s yielded an error instead of returning `NaN`.
 +* [#7646](http://bugzilla.scilab.org/show_bug.cgi?id=7646): Extractions `A'(1,2)` and `A.'(1,2)` from a transposed matrix were not possible
 +* [#7884](http://bugzilla.scilab.org/show_bug.cgi?id=7884): `typeof` help page was poor, puzzled, and not up-to-date to Scilab 6:
    - new typeof `uint64`, `int64`, `void`, `deletelist`, `implicitlist ` were missing
    - former `hypermat` and `size implicit` typeof weren't removed
    - typeof names longer than 8-char were not documented.
@@@ -1,8 -1,8 +1,8 @@@
-         <project name="common_qa">
+     <project name="common_qa">
      <!--  Unitary testing + code coverage -->
 -    
 +
      <property name="base.dir" location="../../"/>
 -    
 +
      <!-- JAR names -->
      <property file="${base.dir}/scilab-lib.properties"/>
      <property file="${base.dir}/scilab-lib-doc.properties"/>
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1,9 -1,10 +1,10 @@@
  /*
   * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
   * Copyright (C) 2009 - DIGITEO - Clement DAVID
-  * Copyright (C) 2011-2016 - Scilab Enterprises - Clement DAVID
 - * Copyright (C) 2011-2015 - Scilab Enterprises - Clement DAVID
++ * Copyright (C) 2011-2017 - Scilab Enterprises - Clement DAVID
+  * Copyright (C) 2015 - Marcos CARDINOT
   *
-- * Copyright (C) 2012 - 2016 - Scilab Enterprises
++ * Copyright (C) 2012 - 2017 - Scilab Enterprises
   *
   * This file is hereby licensed under the terms of the GNU GPL v2.0,
   * pursuant to article 5.3.4 of the CeCILL v.2.1.
  
  package org.scilab.modules.xcos.palette;
  
- import java.awt.Point;
- import java.awt.datatransfer.Transferable;
  import java.awt.dnd.DnDConstants;
- import java.awt.dnd.DragGestureEvent;
  import java.awt.dnd.DragGestureListener;
  import java.awt.dnd.DragSource;
- import java.awt.dnd.InvalidDnDOperationException;
- import java.util.logging.Logger;
+ import java.awt.event.KeyListener;
+ import java.awt.event.MouseListener;
  
- import org.scilab.modules.gui.messagebox.ScilabModalDialog;
- import org.scilab.modules.gui.messagebox.ScilabModalDialog.IconType;
 +import org.scilab.modules.localization.Messages;
- import org.scilab.modules.xcos.JavaController;
- import org.scilab.modules.xcos.Kind;
  import org.scilab.modules.xcos.block.BasicBlock;
- import org.scilab.modules.xcos.graph.XcosDiagram;
- import org.scilab.modules.xcos.graph.model.XcosCellFactory;
++import org.scilab.modules.xcos.palette.PaletteCtrl;
+ import org.scilab.modules.xcos.palette.listener.PaletteBlockKeyListener;
  import org.scilab.modules.xcos.palette.listener.PaletteBlockMouseListener;
+ import org.scilab.modules.xcos.palette.listener.PaletteDragGestureListener;
  import org.scilab.modules.xcos.palette.model.PaletteBlock;
  import org.scilab.modules.xcos.palette.view.PaletteBlockView;
+ import org.scilab.modules.xcos.palette.view.PaletteBlockView.StatusUI;
  import org.scilab.modules.xcos.palette.view.PaletteManagerView;
- import org.scilab.modules.xcos.utils.BlockPositioning;
 +import org.scilab.modules.xcos.utils.XcosMessages;
  
- import com.mxgraph.swing.handler.mxGraphTransferHandler;
  import com.mxgraph.swing.util.mxGraphTransferable;
- import org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement;
  
  /**
-  * A palette block is the representation of the block in the palette. All the
-  * operations there are used to render, load and put (on a diagram) a block.
+  * A palette block is the representation of the block in the palette.
+  * @author Marcos CARDINOT <mcardinot@gmail.com>
+  * @author Clement DAVID
   */
  public final class PaletteBlockCtrl {
-     /**
-      * Internal graph used to render each block.
-      */
-     public static final XcosDiagram INTERNAL_GRAPH;
-     static {
-         JavaController controller = new JavaController();
-         INTERNAL_GRAPH = new XcosDiagram(controller, controller.createObject(Kind.DIAGRAM), Kind.DIAGRAM, "");
-         INTERNAL_GRAPH.installListeners();
-     }
  
-     private static final double BLOCK_DEFAULT_POSITION = 10.;
-     private static final Logger LOG = Logger.getLogger(PaletteBlockCtrl.class.getName());
+     private static final DragGestureListener DRAG_LISTENER = new PaletteDragGestureListener();
+     private static final KeyListener KEY_LISTENER = new PaletteBlockKeyListener();
+     private static final MouseListener MOUSE_LISTENER = new PaletteBlockMouseListener();
  
 +    private static final String UNABLE_TO_LOAD_BLOCK = Messages.gettext("Unable to load block from %s .");
 +    private static final String LOADING_THE_BLOCK = Messages.gettext("Loading the block") + XcosMessages.DOTS;
 +
-     private static PaletteBlockCtrl previouslySelected;
+     private final PaletteCtrl paletteCtrl;
      private final PaletteBlock model;
      private final PaletteBlockView view;
+     private BasicBlock basicBlock;
+     private boolean isSelected;
  
      /**
       * Default constructor
-      *
-      * @param model
-      *            the block data
+      * @param ctrl The palette in which it belongs
+      * @param model the block data
       */
-     public PaletteBlockCtrl(PaletteBlock model) {
+     public PaletteBlockCtrl(PaletteCtrl ctrl, PaletteBlock model) {
+         this.paletteCtrl = ctrl;
          this.model = model;
          this.view = new PaletteBlockView(this);
-         installListeners(this.view);
-     }
+         this.isSelected = false;
+         this.basicBlock = null;
  
-     /**
-      * @param view
-      *            The view to setup
-      */
-     private void installListeners(PaletteBlockView view) {
-         view.addMouseListener(new PaletteBlockMouseListener());
+         // add block to its parent palette
+         this.paletteCtrl.addBlock(this);
  
-         DragSource dragSource = DragSource.getDefaultDragSource();
-         dragSource.createDefaultDragGestureRecognizer(this.getView(), DnDConstants.ACTION_MOVE, new PaletteDragGestureListener(getModel(), this));
-     }
+         // install listeners
+         this.view.setFocusTraversalKeysEnabled(false);
+         this.view.addKeyListener(KEY_LISTENER);
+         this.view.addMouseListener(MOUSE_LISTENER);
  
-     /**
-      * @return the view
-      */
-     public PaletteBlockView getView() {
-         return view;
+         DragSource dragSource = DragSource.getDefaultDragSource();
 -        dragSource.createDefaultDragGestureRecognizer(this.getView(),
 -                DnDConstants.ACTION_COPY, DRAG_LISTENER);
++        dragSource.createDefaultDragGestureRecognizer(this.getView(), DnDConstants.ACTION_COPY, DRAG_LISTENER);
      }
  
      /**
index 0000000,28ef9c0..974fd69
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,185 +1,185 @@@
+ /*
+  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+  * Copyright (C) 2015 - Marcos CARDINOT
+  *
+  * This file must be used under the terms of the CeCILL.
+  * This source file is licensed as described in the file COPYING, which
+  * you should have received as part of this distribution.  The terms
+  * are also available at
+  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
+  *
+  */
+ package org.scilab.modules.xcos.palette;
+ import java.awt.Dimension;
+ import java.awt.datatransfer.Transferable;
+ import java.util.ArrayList;
+ import java.util.List;
+ import java.util.logging.Level;
+ import java.util.logging.Logger;
+ import org.scilab.modules.action_binding.highlevel.ScilabInterpreterManagement.InterpreterException;
+ import org.scilab.modules.xcos.JavaController;
+ import org.scilab.modules.xcos.Kind;
+ import org.scilab.modules.xcos.block.BasicBlock;
+ import org.scilab.modules.xcos.graph.XcosDiagram;
+ import org.scilab.modules.xcos.graph.model.XcosCellFactory;
+ import org.scilab.modules.xcos.palette.listener.PaletteMouseListener;
+ import org.scilab.modules.xcos.palette.view.PaletteManagerView;
+ import org.scilab.modules.xcos.palette.view.PaletteView;
+ import org.scilab.modules.xcos.utils.BlockPositioning;
+ import org.scilab.modules.xcos.utils.XcosConstants;
+ import org.scilab.modules.xcos.utils.XcosMessages;
+ import com.mxgraph.swing.handler.mxGraphTransferHandler;
+ import com.mxgraph.swing.util.mxGraphTransferable;
+ /**
+  * All the operations which are used to render, load and put
+  * the selected blocks on a diagram.
+  * @author Marcos Cardinot <mcardinot@gmail.com>
+  */
+ public final class PaletteCtrl {
+     /**
+      * Internal graph used to render the selected blocks.
+      */
+     private static XcosDiagram internalGraph;
+     static {
+         JavaController controller = new JavaController();
+         internalGraph = new XcosDiagram(controller, controller.createObject(Kind.DIAGRAM), Kind.DIAGRAM, "");
+         internalGraph.installListeners();
+     }
+     private static final PaletteMouseListener MOUSE_LISTENER = new PaletteMouseListener();
+     private static final Logger LOG = Logger.getLogger(PaletteBlockCtrl.class.getName());
+     private static final int BLOCKS_BY_ROW = 5;
+     private static final Dimension BLOCK_POSITION = XcosConstants.PaletteBlockSize.NORMAL.getBlockDimension();
+     private static final List<PaletteBlockCtrl> BLOCKS = new ArrayList<PaletteBlockCtrl>();
+     private final PaletteView view;
+     /**
+      * Default constructor
+      */
+     public PaletteCtrl() {
+         this.view = new PaletteView();
+         // install listeners
+         this.view.addMouseListener(MOUSE_LISTENER);
+         this.view.addMouseMotionListener(MOUSE_LISTENER);
+     }
+     /**
+      * @return the view
+      */
+     public PaletteView getView() {
+         return view;
+     }
+     /**
+      * Clear the view
+      */
+     public void clear() {
+         BLOCKS.clear();
+         view.removeAll();
+     }
+     /**
+      * Deselects all blocks
+      */
+     public static void clearSelections() {
+         for (PaletteBlockCtrl block : BLOCKS) {
+             block.setSelected(false);
+         }
+     }
+     /**
+      * Adds a block to the view.
+      * @param ctrl PaletteBlockCtrl
+      */
+     public void addBlock(PaletteBlockCtrl ctrl) {
+         BLOCKS.add(ctrl);
+         view.add(ctrl.getView());
+     }
+     /**
+      * Get the selected palette blocks
+      * @return blocks that have been added to the XcosDiagram
+      */
+     public Object[] getSelectedBlocks() {
+         int row = 0;
+         int column = 0;
+         List<BasicBlock> basicBlocks = new ArrayList<BasicBlock>();
+         for (PaletteBlockCtrl blockCtrl : BLOCKS) {
+             if (!blockCtrl.isSelected()) {
+                 continue;
+             }
+             BasicBlock basicBlock = null;
+             try {
+                 basicBlock = XcosCellFactory.createBlock(blockCtrl.getModel().getName());
+             } catch (InterpreterException e) {
+             }
+             if (basicBlock == null) {
+                 if (LOG.isLoggable(Level.FINEST)) {
+                     LOG.finest(String.format(XcosMessages.UNABLE_TO_LOAD_BLOCK,
 -                            blockCtrl.getModel().getData().getEvaluatedPath()));
++                                             blockCtrl.getModel().getData().getEvaluatedPath()));
+                 }
+                 getView().setEnabled(false);
+                 continue;
+             }
+             // add to the 'recently used blocks' panel
+             PaletteManagerView.get().getPanel().addRecentltyUsedBlock(blockCtrl.getModel());
+             // render and export it
+             final double margin = 15.0;
+             basicBlock.getGeometry().setX(margin + BLOCK_POSITION.width * column);
+             basicBlock.getGeometry().setY(margin + BLOCK_POSITION.height * row);
+             ++column;
+             if (column >= BLOCKS_BY_ROW) {
+                 column = 0;
+                 ++row;
+             }
+             basicBlocks.add(basicBlock);
+         }
+         int size = basicBlocks.size();
+         if (size == 0) {
+             return null;
+         }
+         // convert to Object[]
+         Object[] ret = new Object[size];
+         for (int i = 0; i < size; i++) {
+             ret[i] = basicBlocks.get(i);
+         }
+         return ret;
+     }
+     /**
+      * This function is used to get all selected blocks.
+      * @return the transferable object
+      */
 -    public synchronized Transferable getTransferable() {
++    public Transferable getTransferable() {
+         Transferable transfer = null;
+         Object[] cells = getSelectedBlocks();
+         if (cells == null) {
+             return null;
+         }
+         BlockPositioning.updatePortsPosition(internalGraph, cells);
+         internalGraph.addCells(cells);
+         mxGraphTransferHandler handler = (mxGraphTransferHandler) internalGraph.getAsComponent().getTransferHandler();
+         transfer = new mxGraphTransferable(cells, internalGraph.getPaintBounds(cells),
 -                handler.createTransferableImage(internalGraph.getAsComponent(), cells));
++                                           handler.createTransferableImage(internalGraph.getAsComponent(), cells));
+         return transfer;
+     }
+ }
  package org.scilab.modules.xcos.palette.view;
  
  import java.awt.Color;
 +import java.awt.event.ActionEvent;
 +import java.awt.event.ActionListener;
+ import java.awt.Component;
+ import java.awt.Dimension;
+ import java.awt.Toolkit;
+ import java.awt.event.MouseWheelEvent;
+ import java.awt.event.MouseWheelListener;
+ import java.util.ArrayList;
  import java.util.List;
  
  import javax.swing.DropMode;
@@@ -26,89 -32,44 +34,108 @@@ import javax.swing.JScrollBar
  import javax.swing.JScrollPane;
  import javax.swing.JSplitPane;
  import javax.swing.JTree;
- import javax.swing.SwingUtilities;
 +import javax.swing.Timer;
  import javax.swing.tree.TreeNode;
  import javax.swing.tree.TreePath;
  import javax.swing.tree.TreeSelectionModel;
- import org.scilab.modules.xcos.palette.PaletteBlockCtrl;
  
+ import org.scilab.modules.xcos.JavaController;
+ import org.scilab.modules.xcos.Kind;
+ import org.scilab.modules.xcos.graph.PaletteDiagram;
++import org.scilab.modules.xcos.palette.PaletteCtrl;
++import org.scilab.modules.xcos.palette.PaletteBlockCtrl;
  import org.scilab.modules.xcos.palette.PaletteManager;
+ import org.scilab.modules.xcos.palette.actions.NavigationAction;
+ import org.scilab.modules.xcos.palette.actions.ZoomAction;
  import org.scilab.modules.xcos.palette.listener.PaletteManagerMouseListener;
  import org.scilab.modules.xcos.palette.listener.PaletteManagerTreeSelectionListener;
- import org.scilab.modules.xcos.palette.listener.PaletteManagerTreeWillExpandListener;
  import org.scilab.modules.xcos.palette.listener.PaletteTreeTransferHandler;
+ import org.scilab.modules.xcos.palette.model.Category;
+ import org.scilab.modules.xcos.palette.model.Custom;
  import org.scilab.modules.xcos.palette.model.PaletteBlock;
+ import org.scilab.modules.xcos.palette.model.PaletteNode;
  import org.scilab.modules.xcos.palette.model.PreLoaded;
 +import org.scilab.modules.xcos.utils.Stack;
  import org.scilab.modules.xcos.utils.XcosConstants;
+ import org.scilab.modules.xcos.utils.XcosConstants.PaletteBlockSize;
  
  /**
   * The content pane for the block view
   */
  @SuppressWarnings(value = { "serial" })
  public class PaletteManagerPanel extends JSplitPane {
+     /** Name of tree node for recently used blocks **/
+     public static final String RECENTLY_USED_BLOCKS = "Recently Used Blocks";
 +    private static final int NUMBER_OF_DUMMY_BLOCKS = 10; // 10 blocks loaded,
 +    private static final int LOAD_DUMMY_BLOCK_DELAY = 200; // one each 200 milliseconds
 +
 +    private static final class LoadBlock implements ActionListener {
 +        private final PaletteManager controller;
 +        private int loadedBlocks;
 +
 +        private Stack<TreeNode> nodeStack;
 +        private Stack<PaletteBlock> blocksStack;
 +
 +        LoadBlock(final PaletteManager controller, final int loadedBlocks) {
 +            this.controller = controller;
 +            this.loadedBlocks = loadedBlocks;
 +
 +            nodeStack = new Stack<>();
 +            nodeStack.push(controller.getRoot());
 +            blocksStack = new Stack<>();
 +        }
 +
 +        @Override
 +        public void actionPerformed(ActionEvent e) {
 +
 +            // load only a limited set of blocks
 +            if (loadedBlocks <= 0) {
 +                Timer timer = (Timer) e.getSource();
 +                timer.stop();
 +            }
 +
 +            // consume a block
 +            if (blocksStack.size() != 0) {
 +                loadTransferable(blocksStack.pop());
 +                return;
 +            }
 +
 +            // no block is available, look for a Preloaded palette
 +            while (nodeStack.size() != 0) {
 +                TreeNode o = nodeStack.pop();
 +
 +                if (o instanceof PreLoaded) {
 +                    // found it a palette, create a dummy transferable from the first block and store the others for later use.
 +                    blocksStack.addAll(((PreLoaded) o).getBlock());
 +
 +                    if (blocksStack.size() != 0) {
 +                        loadTransferable(blocksStack.pop());
 +                        return;
 +                    }
 +                } else {
 +                    for (int i = 0; i < o.getChildCount(); i++) {
 +                        nodeStack.push(o.getChildAt(i));
 +                    }
 +                }
 +            }
 +        }
 +
 +        private void loadTransferable(final PaletteBlock blk) {
-             new PaletteBlockCtrl(blk).getTransferable();
++            new PaletteBlockCtrl(new PaletteCtrl(), blk).getPaletteCtrl().getTransferable();
 +            loadedBlocks -= 1;
 +        }
 +    }
 +
+     private static XcosConstants.PaletteBlockSize currentSize;
 -    private PaletteManager controller;
 +    private final PaletteManager controller;
+     private CustomMouseWheelListener mouseWheelListener;
+     private JTree tree;
+     private PaletteDiagram diagramInstance;
+     private List<TreePath> historyNext;
+     private List<TreePath> historyPrev;
+     private TreePath currentPath;
  
      /**
       * Default constructor
      }
  
      /**
-      * Init the ScrollPane component
-      *
-      * @param panel
-      *            the component
+      * Get the current PaletteBlockSize
+      * @return current PaletteBlockSize
       */
-     private void initJScrollPane(JScrollPane panel) {
-         panel.setBackground(Color.WHITE);
-         panel.getVerticalScrollBar().setBlockIncrement(
-             XcosConstants.PALETTE_BLOCK_HEIGHT
+     public static PaletteBlockSize getCurrentSize() {
+         return currentSize;
+     }
+     /**
 -     * Adds a PaletteBlock to the list of recently used blocks. 
++     * Adds a PaletteBlock to the list of recently used blocks.
+      * @param block PaletteBlock
+      */
+     public void addRecentltyUsedBlock(PaletteBlock block) {
+         PaletteNode currentNode = (PaletteNode) tree.getLastSelectedPathComponent();
+         if (currentNode != null && currentNode.getName().equals(RECENTLY_USED_BLOCKS)) {
+             return;
+         }
+         final Category root = PaletteManager.getInstance().getRoot();
+         List<PaletteNode> nodes = root.getNode();
+         PreLoaded p = null;
+         for (PaletteNode n : nodes) {
+             if (n.getName().equals(RECENTLY_USED_BLOCKS) && n instanceof PreLoaded) {
+                 p = (PreLoaded) n;
+                 break;
+             }
+         }
+         if (p == null) {
+             p = new PreLoaded();
+             p.setName(RECENTLY_USED_BLOCKS);
+             p.setEnable(true);
+             root.getNode().add(p);
+             p.setParent(root);
+             PaletteNode.refreshView(root, currentNode);
+         }
+         List<PaletteBlock> blocks = p.getBlock();
+         for (PaletteBlock b : blocks) {
+             if (b.getName().equals(block.getName())) {
+                 return;
+             }
+         }
+         if (blocks.size() >= XcosConstants.MAX_RECENTLY_USED_BLOCKS) {
+             blocks.remove(XcosConstants.MAX_RECENTLY_USED_BLOCKS - 1);
+         }
+         blocks.add(0, block);
+     }
+     /**
+      * Zoom
+      * @param newSize new paletteblocksize enum
+      */
+     // CSOFF: CyclomaticComplexity
+     private void zoom(PaletteBlockSize newSize) {
+         if (newSize == null || newSize == currentSize) {
+             return;
+         }
+         currentSize = newSize;
+         try {
+             JScrollPane jspR = (JScrollPane) this.getRightComponent();
+             final Dimension dimension = jspR.getPreferredSize();
+             setUpScrollBar(jspR, newSize);
+             // check what's being displayed on the right panel
+             PaletteNode node = (PaletteNode) tree.getLastSelectedPathComponent();
+             if (node instanceof PreLoaded || node == null) {
+                 Component c = jspR.getViewport().getComponent(0);
+                 String cName = c.getName();
+                 PaletteView pview;
+                 if (cName.equals("PaletteView")) {
+                     pview = (PaletteView) c;
+                 } else if (cName.equals("PaletteSearchView")) {
+                     PaletteSearchView sview = (PaletteSearchView) c;
+                     pview = (PaletteView) sview.getComponent(1);
+                 } else {
+                     return;
+                 }
+                 Component[] blockViews = pview.getComponents();
+                 for (Component component : blockViews) {
+                     PaletteBlockView bview = (PaletteBlockView) component;
+                     bview.initComponents();
+                 }
+                 pview.revalidate();
+             } else if (node instanceof Custom) {
+                 jspR = openDiagramAsPal(node);
+                 jspR.setPreferredSize(dimension);
+                 this.setRightComponent(jspR);
+             } else {
+                 return;
+             }
+             // update the status of both zoom buttons
+             if (newSize.next() == null) {
+                 // is it the last zoom-in level?
+                 ZoomAction.setEnabledZoomIn(false);
+                 ZoomAction.setEnabledZoomOut(true);
+             } else if (newSize.previous() == null) {
+                 // is it the last zoom-out level?
+                 ZoomAction.setEnabledZoomIn(true);
+                 ZoomAction.setEnabledZoomOut(false);
+             } else {
+                 ZoomAction.setEnabledZoomIn(true);
+                 ZoomAction.setEnabledZoomOut(true);
+             }
+             jspR.revalidate();
+         } catch (NullPointerException e) {
+             e.printStackTrace();
+         }
+     }
+     /** zoom in **/
+     public void zoomIn() {
+         zoom(currentSize.next());
+     }
+     /** zoom out **/
+     public void zoomOut() {
+         zoom(currentSize.previous());
+     }
+     /**
+      * Open a diagram as a palette.
+      * @param node PaletteNode
+      * @return a JScrollPane with the diagram
+      */
+     public JScrollPane openDiagramAsPal(PaletteNode node) {
+         String path = ((Custom) node).getPath().getEvaluatedPath();
+         JavaController ctroller = new JavaController();
+         this.diagramInstance = new PaletteDiagram(ctroller.createObject(Kind.DIAGRAM));
+         this.diagramInstance.openDiagramAsPal(path);
+         return this.diagramInstance.getAsComponent();
+     }
+     /**
+      * Setup the ScrollPane component
+      * @param jsp The component
+      * @param pbs PaletteBlockSize
+      */
+     private void setUpScrollBar(JScrollPane jsp, PaletteBlockSize pbs) {
+         // vertical
+         jsp.getVerticalScrollBar().setBlockIncrement(
+             pbs.getBlockDimension().height
              + XcosConstants.PALETTE_VMARGIN);
-         panel.getVerticalScrollBar().setUnitIncrement(
-             XcosConstants.PALETTE_BLOCK_HEIGHT
+         jsp.getVerticalScrollBar().setUnitIncrement(
+             pbs.getBlockDimension().height
              + XcosConstants.PALETTE_VMARGIN);
-         panel.getHorizontalScrollBar().setBlockIncrement(
-             XcosConstants.PALETTE_BLOCK_WIDTH
+         // horizontal
+         jsp.getHorizontalScrollBar().setBlockIncrement(
+             pbs.getBlockDimension().width
              + XcosConstants.PALETTE_HMARGIN);
-         panel.getHorizontalScrollBar().setUnitIncrement(
-             XcosConstants.PALETTE_BLOCK_WIDTH
+         jsp.getHorizontalScrollBar().setUnitIncrement(
+             pbs.getBlockDimension().width
              + XcosConstants.PALETTE_HMARGIN);
+         mouseWheelListener.setVerticalScrollBar(jsp.getVerticalScrollBar());
+         // removes the mouse wheel listeners
+         MouseWheelListener[] mwls = jsp.getMouseWheelListeners();
+         for (MouseWheelListener mwl : mwls) {
+             jsp.removeMouseWheelListener(mwl);
+         }
+         // adds the CustomMouseWheelListener
+         jsp.addMouseWheelListener(mouseWheelListener);
      }
  
      /**
  
          /* Global layout */
          setContinuousLayout(true);
 +
 +        // Delay-load some blocks to pre-load jars used on the rendering.
 +        // A timer is used to avoid busying EDT and add a small delay between blocks
 +        Timer timer = new Timer(LOAD_DUMMY_BLOCK_DELAY, new LoadBlock(controller, NUMBER_OF_DUMMY_BLOCKS));
 +        timer.start();
      }
+     /**
+      * Updates the history.
+      */
+     public void updateHistory() {
+         TreePath lastPath = currentPath;
+         currentPath = tree.getSelectionPath();
+         if (lastPath != null && !currentPath.equals(lastPath)) {
+             if (historyPrev.isEmpty()) {
+                 historyPrev.add(lastPath);
+             } else {
+                 int prevPathIdx = historyPrev.size() - 1;
+                 // going backwards?
+                 if (currentPath.equals(historyPrev.get(prevPathIdx))) {
+                     historyNext.add(lastPath);
+                     historyPrev.remove(prevPathIdx);
+                     updateHistorySettings();
+                     return;
+                 } else {
+                     // it seems to be a new path, just store it!
+                     // Soon we'll check if we are just going forward
+                     // or if it's really a new path!
+                     historyPrev.add(lastPath);
+                 }
+             }
+             if (!historyNext.isEmpty()) {
+                 int nextPathIdx = historyNext.size() - 1;
+                 // going forward?
+                 if (currentPath.equals(historyNext.get(nextPathIdx))) {
+                     historyNext.remove(nextPathIdx);
+                 } else {
+                     // it is really a new path!
+                     // make sure it's on the top of the history!
+                     historyNext.clear();
+                 }
+             }
+             updateHistorySettings();
+         }
+     }
+     /**
+      * Update the status of the buttons and the history length.
+      */
+     private void updateHistorySettings() {
+         if (historyNext.size() + historyPrev.size() > XcosConstants.HISTORY_LENGTH) {
+             historyPrev.remove(0);
+         }
+         NavigationAction.setEnabledNext(historyNext.size() > 0);
+         NavigationAction.setEnabledPrev(historyPrev.size() > 0);
+     }
+     /**
+      * Go to the next path (history).
+      */
+     public void goNext() {
+         try {
+             tree.setSelectionPath(historyNext.get(historyNext.size() - 1));
+         } catch (ArrayIndexOutOfBoundsException err) {
+             NavigationAction.setEnabledNext(false);
+         }
+     }
+     /**
+      * Go to the previous path (history).
+      */
+     public void goPrevious() {
+         try {
+             tree.setSelectionPath(historyPrev.get(historyPrev.size() - 1));
+         } catch (ArrayIndexOutOfBoundsException err) {
+             NavigationAction.setEnabledPrev(false);
+         }
+     }
+     /**
+      * Implement custom mouse handling for the zoom
+      */
+     private static final class CustomMouseWheelListener implements MouseWheelListener {
+         private static final int ACCELERATOR_KEY = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
+         private JScrollBar verticalScrollBar;
+         /**
+          * Default constructor
+          */
+         public CustomMouseWheelListener() {
+         }
+         /**
+          * Set the vertical scrollbar
+          * It's important to update the unit increment
+          * @param verticalScrollBar JScrollBar
+          */
+         public void setVerticalScrollBar(JScrollBar verticalScrollBar) {
+             this.verticalScrollBar = verticalScrollBar;
+         }
+         /**
+          * When the wheel is used
+          * @param e The parameters
+          * @see java.awt.event.MouseWheelListener#mouseWheelMoved(java.awt.event.MouseWheelEvent)
+          */
+         @Override
+         public void mouseWheelMoved(MouseWheelEvent e) {
+             if (verticalScrollBar == null) {
+                 // nothing to do!
+                 return;
+             }
+             if (e.getModifiers() == ACCELERATOR_KEY) {
+                 if (e.getWheelRotation() < 0) {
+                     PaletteManagerView.get().getPanel().zoomIn();
+                 } else if (e.getWheelRotation() > 0) {
+                     PaletteManagerView.get().getPanel().zoomOut();
+                 }
+             } else {
+                 int i = verticalScrollBar.getValue();
+                 if (e.getWheelRotation() < 0) {
+                     i -= verticalScrollBar.getUnitIncrement();
+                 } else {
+                     i += verticalScrollBar.getUnitIncrement();
+                 }
+                 verticalScrollBar.setValue(i);
+             }
+         }
+     }
  }