Page 1 of 1

Icon on Node in Tree object

PostPosted: Thu Aug 22, 2019 6:56 pm
by lucdep
Hi,

Is there a way to set a specifiec icon on a tree node, reflecting the state of the row represented by the node, example: row with status OK get a green check icon, rows with status NOK get a red cross...

My status datatables, that are referenced from the main table, have already image fields with icons for each status, and in tables and forms it's easy to show them, but I can't find how I can show the images in a tree object.

Thanks for your quick reply.

Luc

Re: Icon on Node in Tree object

PostPosted: Sun Aug 25, 2019 5:49 pm
by johnit
Found in documentation.

Re: Icon on Node in Tree object

PostPosted: Thu Aug 29, 2019 12:31 pm
by lucdep
Hi,

Thanks for your reply, I tried the sample code you refer to, but it shows a strange behaviour:

First test:
Code: Select all
public IImage getNodeImage(IDataBook pDataBook, IDataPage pDataPage, IDataRow pDataRow, String pColumnName, int pRow, boolean pExpanded, boolean pLeaf) throws Throwable
   {
      
      if (pDataBook == rdbPdvePdversion)
      {
         return UIImage.getImage("/be/moonfox/apps/max/images/frame.png");
      }

      return null;

   }


works as expected;

Second test:

I create a new icon named pink.png (copy from frame.png)

Code: Select all

public IImage getNodeImage(IDataBook pDataBook, IDataPage pDataPage, IDataRow pDataRow, String pColumnName, int pRow, boolean pExpanded, boolean pLeaf) throws Throwable
   {
      
      if (pDataBook == rdbPdvePdversion)
      {
         return UIImage.getImage("/be/moonfox/apps/max/images/pink.png");
      }

      return null;

   }

gives "resource unavailable" error, although the pink.png resides in the same folder as the frame.png that works well.

Third test:

As my purpose is to define the node dynamically, refering to the status of the row, I tried following code which compiles without error, but shows no icon

Code: Select all
public IImage getNodeImage(IDataBook pDataBook, IDataPage pDataPage, IDataRow pDataRow, String pColumnName, int pRow, boolean pExpanded, boolean pLeaf) throws Throwable
   {
      
      if (pDataBook == rdbPdvePdversion)
      {
         return (UIImage)(pDataRow.getValue("PDVE_DSST_ICON"));
      }

      return null;

   }


PDVE_DSST_ICON is an Image Field which show correctly as a field in the Form.

What is going wrong? Any idea?

Luc

Re: Icon on Node in Tree object

PostPosted: Thu Aug 29, 2019 7:31 pm
by Support@SIB
Did you press "Apply external changes" in VisionX? It's necessary to tell VisionX that you changed the application "outside". This should solve the problem with pink.png.

Are you sure that your column: PDVE_DSST_ICON contains an instance of UIImage?

If you use static images, please cache them and don't create new instances every time. It's not super fast and consumes more memory than needed. If you have dynamic images, saved in the database, it's clear but a cache could improve performance as well.

Re: Icon on Node in Tree object

PostPosted: Thu Aug 29, 2019 7:44 pm
by lucdep
Hi,

Code: Select all
rdbPdvePdversion.getRowDefinition().getColumnDefinition("PDVE_DSST_ICON").getDataType().setCellEditor(ProjXUtil.IMAGE_VIEWER);
.....

editPdvePdversionPdveDsstIcon.setDataRow(rdbPdvePdversion);
editPdvePdversionPdveDsstIcon.setColumnName("PDVE_DSST_ICON");
editPdvePdversionPdveDsstIcon.setForeground(null);


The column PDVE_DSST_ICON contains an uploaded image and shows it OK in editPdvePdversionPdveDsstIcon field.

I want however to show the status icon of all entries in the Tree object as well.

The Icons are uploaded by the users when the create the different possible status in a linked table Dsst_Design_Status (which contains the columns ID, Status_Name and Icon)

I have catched the exception on

Code: Select all
return (UIImage)(pDataRow.getValue("PDVE_DSST_ICON"));


which is : java.lang.ClassCastException: class [B cannot be cast to class javax.rad.genui.UIImage ([B is in module java.base of loader 'bootstrap'; javax.rad.genui.UIImage is in unnamed module of loader java.net.URLClassLoader @5fd0d5ae)
Luc

Re: Icon on Node in Tree object

PostPosted: Thu Aug 29, 2019 8:43 pm
by Support@SIB
Clear, because it's a binary column. The Image viewer takes care of the data type and shows an image instead of the binary content. One advantage of JVx.

So, simply create an image, e.g.

Code: Select all
new UIImage(BinaryDataType.getContent(getValue("COLUMN"));

and a cache would be useful if images don't change too often. Otherwise the image will be created very often!

You could add a memory column to your databook, before open like this:

Code: Select all
book.getRowDefinition().addColumnDefinition(new ColumnDefinition("UIIMAGE", new ObjectDataType()));
book.open();

...

book.setValue("UIIMAGE", image);

if temp image is null, create a new instance, otherwise reuse it... Just an idea.

Re: Icon on Node in Tree object

PostPosted: Wed Sep 11, 2019 1:02 pm
by lucdep
Thanks, works perfectly.