Update figure function :
[scilab.git] / scilab / modules / gui / sci_gateway / c / sci_figure.c
index 4f6fc91..dc69542 100644 (file)
 #endif
 
 #include "sciprint.h"
+#include "addColor.h"
 
-#define COLOR_COMPONENT 3
 /*--------------------------------------------------------------------------*/
-void setDefaultProperties(int _iFig);
-int addColor(int _iFig, double* _pdblColor);
-int cloneGDFWithId(int _iId);
+int setDefaultProperties(int _iFig, BOOL bDefaultAxes);
 /*--------------------------------------------------------------------------*/
 int sci_figure(char * fname, unsigned long fname_len)
 {
@@ -50,7 +48,6 @@ int sci_figure(char * fname, unsigned long fname_len)
     int i = 0;
     int iNewId = -1;
     int iAxes = 0;
-    int* piAxes = &iAxes;
     int iPropertyOffset = 0;
     BOOL bDoCreation = TRUE;
     BOOL bVisible = TRUE; // Create a visible figure by default
@@ -59,6 +56,7 @@ int sci_figure(char * fname, unsigned long fname_len)
     int iMenubarType = 1; // Create a 'figure' menubar by default
     int iToolbarType = 1; // Create a 'figure' toolbar by default
     double dblId = 0;
+    BOOL status = FALSE;
 
     //figure(num) -> scf(num)
     //figure() -> scf()
@@ -68,32 +66,8 @@ int sci_figure(char * fname, unsigned long fname_len)
     // figure()
     if (iRhs == 0) // Auto ID
     {
-        //get highest value of winsid to create the new windows @ + 1
-        int nbFigure = sciGetNbFigure();
-
-        if (nbFigure)
-        {
-            int * ids = (int*)MALLOC(nbFigure * sizeof(int));
-
-            if (ids == NULL)
-            {
-                Scierror(999, _("%s: No more memory.\n"), fname);
-                return 0;
-            }
-            sciGetFiguresId(ids);
-
-            //find highest value
-            for (i = 0 ; i < nbFigure ; i++)
-            {
-                if (ids[i] > iNewId)
-                {
-                    iNewId = ids[i];
-                }
-            }
-        }
-        //use next value
-        iNewId = iNewId + 1;
-        iFig = cloneGDFWithId(iNewId);
+        iFig = createNewFigureWithAxes();
+        iAxes = setDefaultProperties(iFig, TRUE);
         createScalarHandle(pvApiCtx, iRhs + 1, getHandle(iFig));
         AssignOutputVariable(pvApiCtx, 1) = iRhs + 1;
         ReturnArguments(pvApiCtx);
@@ -102,9 +76,6 @@ int sci_figure(char * fname, unsigned long fname_len)
 
     if (iRhs == 1)
     {
-        int iNewId = -1;
-        int iAxes = 0;
-        int* piAxes = &iAxes;
         //figure(x);
         sciErr = getVarAddressFromPosition(pvApiCtx, 1, &piAddr);
         if (sciErr.iErr)
@@ -132,11 +103,11 @@ int sci_figure(char * fname, unsigned long fname_len)
         iFig = getFigureFromIndex(iId);
         if (iFig == 0) // Figure does not exists, create a new one
         {
-            iFig = cloneGDFWithId(iId);
+            iFig = createNewFigureWithAxes();
+            setGraphicObjectProperty(iFig, __GO_ID__, &iId, jni_int,  1);
+            iAxes = setDefaultProperties(iFig, TRUE);
         }
-        setCurrentFigure(iFig);
-        getGraphicObjectProperty(iFig, __GO_SELECTED_CHILD__, jni_int,  (void**)&piAxes);
-        setCurrentSubWin(iAxes);
+
         createScalarHandle(pvApiCtx, iRhs + 1, getHandle(iFig));
         AssignOutputVariable(pvApiCtx, 1) = iRhs + 1;
         ReturnArguments(pvApiCtx);
@@ -147,31 +118,8 @@ int sci_figure(char * fname, unsigned long fname_len)
     if (iRhs % 2 == 0)
     {
         //get highest value of winsid to create the new windows @ + 1
-        int nbFigure = sciGetNbFigure();
+        iNewId = getValidDefaultFigureId();
         iPos = 0;
-
-        if (nbFigure)
-        {
-            int * ids = (int*)MALLOC(nbFigure * sizeof(int));
-
-            if (ids == NULL)
-            {
-                Scierror(999, _("%s: No more memory.\n"), fname);
-                return 0;
-            }
-            sciGetFiguresId(ids);
-
-            //find highest value
-            for (i = 0 ; i < nbFigure ; i++)
-            {
-                if (ids[i] > iNewId)
-                {
-                    iNewId = ids[i];
-                }
-            }
-        }
-        //use next value
-        iNewId = iNewId + 1;
     }
     else
     {
@@ -228,10 +176,10 @@ int sci_figure(char * fname, unsigned long fname_len)
                 return 1;
             }
             if (stricmp(pstProName, "dockable") != 0
-                && stricmp(pstProName, "toolbar") != 0
-                && stricmp(pstProName, "menubar") != 0
-                && stricmp(pstProName, "default_axes") != 0
-                && stricmp(pstProName, "visible") != 0 )
+                    && stricmp(pstProName, "toolbar") != 0
+                    && stricmp(pstProName, "menubar") != 0
+                    && stricmp(pstProName, "default_axes") != 0
+                    && stricmp(pstProName, "visible") != 0 )
             {
                 freeAllocatedSingleString(pstProName);
                 continue;
@@ -343,7 +291,7 @@ int sci_figure(char * fname, unsigned long fname_len)
         }
         iFig = createFigure(bDockable, iMenubarType, iToolbarType, bDefaultAxes, bVisible);
         setGraphicObjectProperty(iFig, __GO_ID__, &iNewId, jni_int, 1);
-
+        setDefaultProperties(iFig, bDefaultAxes);
     }
 
     //set(iFig, iPos, iPos + 1)
@@ -382,18 +330,6 @@ int sci_figure(char * fname, unsigned long fname_len)
             continue;
         }
 
-        //check property value to compatibility
-        if (stricmp(pstProName, "backgroundcolor") == 0)
-        {
-            freeAllocatedSingleString(pstProName);
-            pstProName = strdup("background");
-        }
-        else if (stricmp(pstProName, "foregroundcolor") == 0)
-        {
-            freeAllocatedSingleString(pstProName);
-            pstProName = strdup("foreground");
-        }
-
         //get address of value on stack
         sciErr = getVarAddressFromPosition(pvApiCtx, i + 1, &piAddrData);
         if (sciErr.iErr)
@@ -457,19 +393,33 @@ int sci_figure(char * fname, unsigned long fname_len)
                     _pvData = (void*)piAddrData;         /* In this case l3 is the list position in stack */
                     break;
             }
+        }
 
-            callSetProperty(pvApiCtx, iFig, _pvData, iType, iRows, iCols, pstProName);
-            if (iType == sci_strings)
+        callSetProperty(pvApiCtx, iFig, _pvData, iType, iRows, iCols, pstProName);
+
+        // If backgroundcolor is set :
+        // * add it to colormap => performed by callSetProperty
+        // * set background to index => performed by callSetProperty
+        // * copy value into axes background property
+        if (stricmp(pstProName, "backgroundcolor") == 0 && iAxes > 0)
+        {
+            int iBackground = 0;
+            int *piBackground = &iBackground;
+
+            getGraphicObjectProperty(iFig, __GO_BACKGROUND__, jni_int, (void **)&piBackground);
+            setGraphicObjectProperty(iAxes, __GO_BACKGROUND__, piBackground, jni_int, 1);
+        }
+
+        if (iType == sci_strings)
+        {
+            //free allacted data
+            if (isMatrixOfString == 1)
             {
-                //free allacted data
-                if (isMatrixOfString == 1)
-                {
-                    freeAllocatedMatrixOfString(iRows, iCols, (char**)_pvData);
-                }
-                else
-                {
-                    freeAllocatedSingleString((char*)_pvData);
-                }
+                freeAllocatedMatrixOfString(iRows, iCols, (char**)_pvData);
+            }
+            else
+            {
+                freeAllocatedSingleString((char*)_pvData);
             }
         }
     }
@@ -481,28 +431,10 @@ int sci_figure(char * fname, unsigned long fname_len)
     return 0;
 }
 /*--------------------------------------------------------------------------*/
-int cloneGDFWithId(int _iID)
-{
-    int iAxes;
-    int *piAxes = &iAxes;
-    //create a new window with id = iNewId
-    int iFig = createNewFigureWithAxes();
-    setGraphicObjectProperty(iFig, __GO_ID__, &_iID, jni_int, 1);
-    setCurrentFigure(iFig);
-
-    getGraphicObjectProperty(iFig, __GO_SELECTED_CHILD__, jni_int,  (void**)&piAxes);
-    setCurrentSubWin(iAxes);
-
-    //setting up new figure
-    setDefaultProperties(iFig);
-
-    return iFig;
-}
-/*--------------------------------------------------------------------------*/
-void setDefaultProperties(int _iFig)
+int setDefaultProperties(int _iFig, BOOL _bDefaultAxes)
 {
     //get figure axes
-    int iAxes = getOrCreateDefaultSubwin();
+    int iAxes = -1;
     int iDrawing = 0;
     int iColorIndex = 0;
     int iFilled = 0;
@@ -513,78 +445,25 @@ void setDefaultProperties(int _iFig)
 
     iColorIndex = addColor(_iFig, pdblNewColor);
 
-    //set background in figure and axes to new ( or existting ) color
     setGraphicObjectProperty(_iFig, __GO_BACKGROUND__, &iColorIndex, jni_int, 1);
-    setGraphicObjectProperty(iAxes, __GO_BACKGROUND__, &iColorIndex, jni_int, 1);
-
-    //a.filled = "off"
-    setGraphicObjectProperty(iAxes, __GO_FILLED__, &iFilled, jni_bool, 1);
+    if (_bDefaultAxes)
+    {
+        iAxes = getOrCreateDefaultSubwin();
+        //set background in figure and axes to new ( or existting ) color
+        setGraphicObjectProperty(iAxes, __GO_BACKGROUND__, &iColorIndex, jni_int, 1);
 
-    //a.axes_visible = "off"
-    setGraphicObjectProperty(iAxes, __GO_X_AXIS_VISIBLE__, &iAxesVisible, jni_bool, 1);
-    setGraphicObjectProperty(iAxes, __GO_Y_AXIS_VISIBLE__, &iAxesVisible, jni_bool, 1);
-    setGraphicObjectProperty(iAxes, __GO_Z_AXIS_VISIBLE__, &iAxesVisible, jni_bool, 1);
+        //a.filled = "off"
+        setGraphicObjectProperty(iAxes, __GO_FILLED__, &iFilled, jni_bool, 1);
 
+        //a.axes_visible = "off"
+        setGraphicObjectProperty(iAxes, __GO_X_AXIS_VISIBLE__, &iAxesVisible, jni_bool, 1);
+        setGraphicObjectProperty(iAxes, __GO_Y_AXIS_VISIBLE__, &iAxesVisible, jni_bool, 1);
+        setGraphicObjectProperty(iAxes, __GO_Z_AXIS_VISIBLE__, &iAxesVisible, jni_bool, 1);
+    }
     //f.immediate_drawing = "on"
     iDrawing = 1;
     setGraphicObjectProperty(_iFig, __GO_IMMEDIATE_DRAWING__, &iDrawing, jni_bool, 1);
-}
-/*--------------------------------------------------------------------------*/
-int addColor(int _iFig, double* _pdblNewColor)
-{
-    int iColorIndex = 0;
-    int i = 0, j = 0;
-    int iColorMapSize = 0;
-    int* piColorMapSize = &iColorMapSize;
-    double* pdblColorMap = NULL;
-    //for new figure, we have to set figure and axes background to [0.8 0.8 0.8]
-    //to do that, we have to update figure.colormap to add new color if not exist.
-    //or get index of color in current color_map
-
-    //first get figure.color_map
-    getGraphicObjectProperty(_iFig, __GO_COLORMAP_SIZE__, jni_int, (void**)&piColorMapSize);
-    getGraphicObjectProperty(_iFig, __GO_COLORMAP__, jni_double_vector, (void **)&pdblColorMap);
-
-    //check if newColor already in coloMap
-    for (i = 0 ; i < iColorMapSize ; i++)
-    {
-        BOOL bFound = TRUE;
-        double* pdblCurrentColor = pdblColorMap + i;
-        for (j = 0 ; j < COLOR_COMPONENT ; j++)
-        {
-            if (*(pdblCurrentColor + j * iColorMapSize) != _pdblNewColor[j])
-            {
-                bFound = FALSE;
-                break;
-            }
-        }
-
-        if (bFound)
-        {
-            iColorIndex = i + 1;
-            break;
-        }
-    }
-
-    //not found in current color map
-    if (iColorIndex == 0)
-    {
-        int iNewColorMapSize = (iColorMapSize + 1) * COLOR_COMPONENT;
-        double* pdblNewColorMap = (double*)MALLOC(sizeof(double) * iNewColorMapSize);
-        //we have to add the new color at the end of the current color map
-        for (i = 0 ; i < COLOR_COMPONENT ; i++)
-        {
-            memcpy(pdblNewColorMap + i * (iColorMapSize + 1),
-                   pdblColorMap + (i * iColorMapSize),
-                   iColorMapSize * sizeof(double));
 
-            pdblNewColorMap[i * (iColorMapSize + 1) + iColorMapSize] = _pdblNewColor[i];
-        }
-
-        setGraphicObjectProperty(_iFig, __GO_COLORMAP__, pdblNewColorMap, jni_double_vector, iNewColorMapSize);
-
-        iColorIndex = iColorMapSize + 1;
-    }
-    return iColorIndex;
+    return iAxes;
 }
 /*--------------------------------------------------------------------------*/