FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin for Harbour/xHarbour xBrowse Fillrect - How to color multiple rows by column
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
xBrowse Fillrect - How to color multiple rows by column
Posted: Wed May 22, 2013 07:13 PM
To All

I am writing a scheduler and would like to be able to put color to the appointment duration for a span of time.

I have looked at Daniel Gil's Calex calendar class to see how he filled in the rows ( must be transparent for the column text ) for a specific column without much success... see below.

I have created an xBrowse populated from an array what paints by a start time ( horizontal row) by Persons Name ( vertical column ).

If I have an appointment that spans multiple 30 minute increments I would like to fill those xy rows a specific color outlining the duration of the appointment... In the below screen shot .. third column from 9:00 to 10:00 am.

If anyone has any suggestions .. I would be most honored by your suggestions and help!

Thanks
Rick Lipkin

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Fri May 24, 2013 03:56 AM
Your program knows the top and bottom rows for the appointment, say nTop and nBot:
Code (fw): Select all Collapse
oCol:bClrStd := { || { CLR_BLACK, If( oBrw:nArrayAt >= nTop .and. oBrw:nArrayAt <= nBot, CLR_YELLOW, CLR_WHITE ) } }


To color a rectangle:

Assume we have two Arrays as static vars.
aSelRows := { nTop, nBottom }
aSelCols := { nLeft, nRight }
Note: I am using two arrays instead one aRect, because this logic easily enables using oBrw:aSelected.

Code (fw): Select all Collapse
for each oCol in oBrw:aCols
   SetClrStd( oCol )
next
....
....
static function SetClrStd( oCol )

oCol:bClrStd := { || { CLR_BLACK, If( oCol:oBrw:BookMark >= aSelRows[ 1 ] .and. oCol:oBrw:BookMark <= aSelRows[ 2 ] .and. oCol:nPos >= aSelCols[ 1 ] .and. oCol:nPos <= aSelCols[ 2 ], CLR_YELLOW, CLR_WHITE ) } }
Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Fri May 24, 2013 12:53 PM

Rao

Thank you for your reply ..

I am struggling to know how to identify the appointment blocks at run time since I have already created the array with the proper values .. all xbrowse does is display the array.

You mentioned bookmarks ... is it possible to create bookmarks at run-time based on the value of the underlying array data .. then use the bookmarks to identify the top and bottom cells to apply the color?

Thanks
Rick Lipkin

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Fri May 24, 2013 03:08 PM

Let us be clear about what oBrw:BookMark means.

oBrw:bBookmark is defined as { |n| If( n == nil, RecNo(), DbGoTo( n ) } for RDD and { |u| If( u == nil, oRs:BookMark, oRs:BookMark := u ) } for RecordSet.

oBrw:BookMark is the same as RecNo() for DBF and oRs:BookMark for RecordSet.

oBrw:BookMark := n means DbGoTo( n ) for DBF and oRs:BookMark := n for RecordSet.

Bookmark does not change when the DBF or RecordSet is sorted in different orders.

oBrw:Bookmark is not something we create to flag (or mark) a row.

For Arrays oBrw:Bookmark is the same as oBrw:nArrayAt.

Regards



G. N. Rao.

Hyderabad, India
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Fri May 24, 2013 04:40 PM
I am struggling to know how to identify the appointment blocks at run time since I have already created the array with the proper values .. all xbrowse does is display the array.


Please have a look at the following sample:
Code (fw): Select all Collapse
#include "fivewin.ch"
#include "xbrowse.ch"

function main()

   local oDlg, oBrw, oFont
   local aData := { ;
   { 1, ''  , 'AA', 'BB', ''   }, ;
   { 2, ''  , ''  , 'BB', ''   }, ;
   { 3, 'AA', 'AA', 'CC', 'DD' }, ;
   { 4, 'CC', 'AA', 'DD', 'EE' }, ;
   { 5, 'CC', 'AA', 'CC', 'EE' }, ;
   { 6, ''  , 'CC', ''  , 'AA' }  }

   DEFINE FONT oFont NAME "TAHOMA" SIZE 0,-14
   DEFINE DIALOG oDlg SIZE 400,240 PIXEL FONT oFont
   @ 10,10 XBROWSE oBrw SIZE -10,-10 PIXEL OF oDlg ;
      DATASOURCE aData AUTOCOLS ;
      CELL LINES NOBORDER

   AEval( oBrw:aCols, { |o| o:bClrStd := SetStdColor( o ) }, 2 )

   WITH OBJECT oBrw
      :nWidths       := 60
      :nDataStrAlignS:= AL_CENTER
      //
      :CreateFromCode()
   END

   ACTIVATE DIALOG oDlg CENTERED
   RELEASE FONT oFont

return nil

static function SetStdColor( oCol )
return { || CellColor( oCol ) }

static function CellColor( oCol )

   local aColor   := { CLR_BLACK, CLR_WHITE }
   local oBrw     := oCol:oBrw
   local nRow     := oBrw:nArrayAt
   local nCol     := oCol:nCreationOrder
   local cVal     := oCol:Value

   if ! Empty( cVal )
      if nRow > 1 .and. cVal == oBrw:aArrayData[ nRow - 1, nCol ]
         aColor   := { CLR_WHITE, CLR_GREEN }
      elseif nRow < oBrw:nLen .and. cVal == oBrw:aArrayData[ nRow + 1, nCol ]
         aColor   := { CLR_WHITE, CLR_GREEN }
      endif
   endif

return aColor


result:


Now can you build the array in a similar way and use similar logic for coloring?
Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Fri May 24, 2013 04:57 PM
Rao

I thought about labeling each cell as I create the array .. and I may have to do that. I was trying not to add text to each cell .. only color the ones starting from the beginning cell and count down the number of cells in the appointment.

I am trying to re-create an appointment screen like this ..

Rick Lipkin

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Fri May 24, 2013 06:07 PM
You can also use oCol:lMergeVert := .t.

Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Fri May 24, 2013 06:13 PM

Rao

I did think about that and looked at how xBrowse.prg was painting the like cells .. Good food for thought..

I will see how that idea works .. would be nice if you could specify the color of the merged data 8)

Appreciate your help and advice!
Rick Lipkin

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Fri May 24, 2013 08:47 PM
I will see how that idea works .. would be nice if you could specify the color of the merged data

Sorry, while working on this I noticed that there is a little bug in painting if we specify a different colour.
Let us keep thinking.
Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Fri May 24, 2013 10:23 PM

Rao

I am re-working the code to build the array .. turning into a nightmare.. hopefully sometime Saturday I will have the re-write on the array and then see if I can do the merge.

I think this will work..

Thanks
Rick Lipkin

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Fri May 24, 2013 10:56 PM
nd then see if I can do the merge.

Please do not consider this option. I thought about it and with the present xbrowse code, you will get stuck up.

Just prepare the array like this. Prepare another array of same size with duration in the corresponding cell of the second array. Keep the duration as number of half-hours ( that gives the number of rows )

Example:
If aData[ 3, 4 ] contains an appointment, aDurn[ 3, 4 ] contains its duration. If the duration is less than 1/2 hour the value is 1. If more than 1/2 hour and less than 1 hour the value is 2. etc.

Then we can draw the cells on our own. Thats a lot better. First please make the two arrays.

I am also assuming that all the rows of the browse will fit into one screen. Right? Or not?
Regards



G. N. Rao.

Hyderabad, India
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: xBrowse Fillrect - How to color multiple rows by column
Posted: Sat May 25, 2013 01:59 PM

Rao

Just curious what problems did you encounter with the vertical merge ? I have not yet got too deep into the array re-write.

Let me study your second array option .. the original xBrowse array creates each row starting with the time .. then loops thru a separate employee array used to build the header columns.. so I really do not store the start date to the array.. each row is created in time increments and each column looks for the matching person's name which places the array data in the correct xy coordinates displayed in the browse.

I am a bit fuzzy on how you can use the second array as a guide to paint the blocks on the browse :?:

As far as fitting on one screen .. depending on the screen resolution .. 1024 x 768 will not allow all the vertical rows to paint without scrolling and the horizontal is based on the number of employees.

I sent you the Schedule.prg via your private e-mail .. please feel free to review the code and make any suggestions...

Thanks
Rick Lipkin

Continue the discussion