Page 1 of 1

How to ... DCBROWSECOL

Posted: Thu Aug 11, 2011 7:20 am
by jdsoft
Hello,

Hou to add a button IN the cel when the cell is marked using arrow-keys or single mouseclick.
The cell widht should remain, the cell content is truncated. On the left side IN the cell i want a DCPUSHBUTTON
If i leave the cell, the button should be removed, and the cell content displayed in full.

I need this for a touch-screen application. The browse should support 3 functions:
1 click (marked)
Double-click (Selected)
Right-click (Content menu)

The goal is to inplement right-mouse-click in a touch-screen.

Regards,
Jack Duijf

Re: How to ... DCBROWSECOL

Posted: Mon Aug 15, 2011 5:02 pm
by rdonnay
Jack -

Here is some code that does what you want except the button is anchored to the right side of the cell.

Roger

Code: Select all

#INCLUDE "dcdialog.ch"

STATIC sxClipBoard := nil

* ----------

FUNCTION Main()

LOCAL GetList[0], oBrowse, oButtonFile, oButtonSize, oMenuFile, oMenuSize, aDir

aDir := Directory()

@ 0,0 DCBROWSE oBrowse SIZE 20,20 FIT DATA aDir ;
      FONT '10.Lucida Console' ;
      ITEMMARKED {||ApplyButton(oButtonFile,oButtonSize,oBrowse)}

DCBROWSECOL ELEMENT 1 PARENT oBrowse HEADER 'File Name' WIDTH 15
DCBROWSECOL ELEMENT 2 PARENT oBrowse HEADER 'File Size' WIDTH 15 PICTURE '99999    ' ALIGN DCGUI_ALIGN_LEFT
DCBROWSECOL ELEMENT 3 PARENT oBrowse HEADER 'File Date' WIDTH 15
DCBROWSECOL ELEMENT 4 PARENT oBrowse HEADER 'File Time' WIDTH 15

@ 0,0 DCPUSHBUTTONXP CAPTION 'p' SIZE 20,20 PIXEL OBJECT oButtonFile ;
      EVAL {|o|o:hide()} ;
      FONT '12.Marlett' ;
      COLOR GRA_CLR_BLACK, GRA_CLR_PINK GRADIENT 5 RADIUS 2 ;
      ACTION {|a,b,o| SetColumn(oBrowse,1), ;
              oMenuFile:PopUp( o:setParent(), o:currentPos(),, ;
              XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN  ) }

@ 0,0 DCPUSHBUTTONXP CAPTION 'p' SIZE 20,20 PIXEL OBJECT oButtonSize ;
      EVAL {|o|o:hide()} ;
      COLOR GRA_CLR_BLACK, GRA_CLR_PALEGRAY GRADIENT 5 RADIUS 2 ;
      FONT '12.Marlett' ;
      ACTION {|a,b,o| SetColumn(oBrowse,2), ;
              oMenuSize:PopUp( o:setParent(), o:currentPos(),, ;
              XBPMENU_PU_DEFAULT + XBPMENU_PU_MOUSE_RBDOWN  ) }

DCSUBMENU oMenuFile PROMPT 'File Menu' OWNERDRAW

  DCMENUITEM 'Cut' PARENT oMenuFile ACTION {||CellCut(oBrowse,'C',1)}
  DCMENUITEM 'Copy' PARENT oMenuFile ACTION {||CellCopy(oBrowse,'C',1)}
  DCMENUITEM SEPARATOR PARENT oMenuFile
  DCMENUITEM 'Paste' PARENT oMenuFile ACTION {||CellPaste(oBrowse,'C',1)}

DCSUBMENU oMenuSize PROMPT 'Size Menu' OWNERDRAW

  DCMENUITEM 'Cut' PARENT oMenuSize ACTION {||CellCut(oBrowse,'N',2)}
  DCMENUITEM 'Copy' PARENT oMenuSize ACTION {||CellCopy(oBrowse,'N',2)}
  DCMENUITEM SEPARATOR PARENT oMenuSize
  DCMENUITEM 'Paste' PARENT oMenuSize ACTION {||CellPaste(oBrowse,'N',2)}


DCREAD GUI FIT TITLE 'Browse with Cell Push Button'

RETURN nil

* ----------

PROC appsys ; RETURN

* ----------

STATIC FUNCTION ApplyButton( oButtonFile, oButtonSize, oBrowse )

LOCAL oColumn, oCell, aRect

oColumn := oBrowse:getColumn(1)
oCell := oColumn:dataArea
aRect := oCell:cellRect(oBrowse:rowPos)

oButtonFile:setParent(oCell)
oButtonFile:show()
oButtonFile:setPos({aRect[3]-21,aRect[2]+1})

oColumn := oBrowse:getColumn(2)
oCell := oColumn:dataArea
aRect := oCell:cellRect(oBrowse:rowPos)

oButtonSize:setParent(oCell)
oButtonSize:show()
oButtonSize:setPos({aRect[3]-21,aRect[2]+1})

RETURN nil

* ----------

STATIC FUNCTION CellCut( oBrowse, nType )

LOCAL oColumn, bEval, xValue

oColumn := oBrowse:getColumn(oBrowse:colPos)

bEval := oColumn:dataLink

xValue := Eval(bEval)
sxClipBoard := xValue

IF nType $ 'CM'
  xValue := ''
ELSEIF nType == 'N'
  xValue := 0
ELSEIF nType == 'L'
  xValue := .f.
ELSEIF nType == 'D'
  xValue := Ctod('')
ENDIF
Eval(bEval,xValue)
oBrowse:refreshCurrent()

RETURN nil

* ---------

STATIC FUNCTION CellCopy( oBrowse, nType )

LOCAL oColumn, bEval, xValue

oColumn := oBrowse:getColumn(oBrowse:colPos)

bEval := oColumn:dataLink

IF nType == 'N'
  xValue := Val(DC_XtoC(Eval(bEval)))
ELSE
  xValue := Eval(bEval)
ENDIF

sxClipBoard := xValue

RETURN nil

* ---------

STATIC FUNCTION CellPaste( oBrowse, nType )

LOCAL oColumn, bEval, xValue, cPaste

oColumn := oBrowse:getColumn(oBrowse:colPos)

bEval := oColumn:dataLink

xValue := Eval(bEval)
cPaste := DC_XtoC(sxClipBoard)

IF nType $ 'CM'
  xValue := cPaste
ELSEIF nType == 'N'
  xValue := Val(cPaste)
ELSEIF nType == 'L'
  xValue := cPaste == 'Y'
ELSEIF nType == 'D'
  xValue := DtoC(cPaste)
ENDIF

Eval(bEval,xValue)
oBrowse:refreshCurrent()

RETURN nil

* ---------

STATIC FUNCTION SetColumn( oBrowse, nPos )

IF nPos > oBrowse:colPos
  DO WHILE nPos > oBrowse:colPos
    oBrowse:right()
    oBrowse:forceStable()
  ENDDO
ELSEIF nPos < oBrowse:colPos
  DO WHILE nPos < oBrowse:colPos
    oBrowse:left()
    oBrowse:forceStable()
  ENDDO
ENDIF

RETURN nil