FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour funcionalidad para Fivewin
Posts: 838
Joined: Wed Aug 22, 2007 10:09 AM
funcionalidad para Fivewin
Posted: Sat May 02, 2015 08:12 AM
Hola Antonio,

Necesitaríamos por favor que el menú tuviera el look de Windows 10:



Muchas gracias.
Saludos / Regards,



FWH 20.04, Harbour 3.2.0 dev (r1909261630) y BCC 7.40
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: funcionalidad para Fivewin
Posted: Sun May 03, 2015 03:50 PM

Moises,

gracias por la sugerencia,

vamos a implementarlo cuanto antes :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: funcionalidad para Fivewin
Posted: Tue May 05, 2015 06:14 PM

Que cláusula usamos para activarlo ?

había pensado usar 2015 por el año.

Alguna otra sugerencia ? He pensado en WIN10, pero me gustaria tener vuestra opinión, gracias

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 2064
Joined: Fri Jan 06, 2006 09:28 PM
Re: funcionalidad para Fivewin
Posted: Wed May 06, 2015 12:14 AM

Que tal FWin10 ? para no dejar por fuera a FiveWin..digo..nose..saludos... :shock:

Dios no está muerto...



Gracias a mi Dios ante todo!
Posts: 838
Joined: Wed Aug 22, 2007 10:09 AM
Re: funcionalidad para Fivewin
Posted: Wed May 06, 2015 07:25 AM

Antonio:

Yo pondría 2015, para seguir con la serie de estilos actualmente en vigor y no confundir.

Muchas gracias.

Saludos / Regards,



FWH 20.04, Harbour 3.2.0 dev (r1909261630) y BCC 7.40
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: funcionalidad para Fivewin
Posted: Wed May 06, 2015 07:27 AM

Si, yo tambien creo que es mejor usar el año o nos haremos un lio...

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: funcionalidad para Fivewin
Posted: Wed May 06, 2015 05:14 PM

Moisés,

No funciona VirtualBox en Windows 10 (10074) y de momento no puedo probarlo en XP.

No puedo probarlo en Windows 10, porque se ve como el de Windows 10 por defecto.

Si quieres publico aqui el código por si lo quieres probar tu, hasta que se me ocurra otra solución.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: funcionalidad para Fivewin
Posted: Fri May 08, 2015 08:42 AM
Moisés,

He preparado este fichero para ir implementando el estilo de menu de Windows 10.

Además de este código hace falta la clase TMenu modificada y menus.ch modificado. Los puedo publicar tambien si te interesa probarlo.

De momento no muestra el estilo de Windows 10. El problema que tengo es que virtualbox no funciona en Windows 10.

menudraw.c
Code (fw): Select all Collapse
#include <Windows.h>
#include <hbapi.h>

BOOL bStrAt( BYTE bChar, LPSTR szText );
HBITMAP CreateMemBitmap( HDC hDC, LPSTR cBitmap );
void pascal DelResource( HANDLE hResource );
void DrawGrayed( HDC, HBITMAP, int, int );
void DrawMasked( HDC, HBITMAP, WORD, WORD );
void Gradient( HDC hDC, RECT * rct, COLORREF crStart, COLORREF crEnd, BOOL bVertical ); 
BOOL HB_ISDIBitmap( LPDRAWITEMSTRUCT lpdis );
long RoundBox( HDC hDC, int iLeft, int iTop, int iRight,
               int iBottom, int iRound1, int iRound2, COLORREF lColor, long lPenSize );
void RegisterResource( HANDLE hResource, LPSTR szType );
LPSTR StrToken( LPSTR szText, WORD wOcurrence, BYTE bSeparator, LPWORD pwLen );

typedef struct _SKIN_MENU
{
   long clr_gradBar1_1;   //first gradient bar colors
   long clr_gradBar1_2;   //second gradient bar colors
   long clr_gradBar2_1;   //first gradient bar colors
   long clr_gradBar2_2;   //second gradient bar colors   
   long clr_leftSide;     // left side color
   long clr_rightSide;    // right side color
   long clr_vertical1;
   long clr_vertical2;
   long clr_box;
   long clr_gradSelected1_1;
   long clr_gradSelected1_2;
   long clr_gradSelected2_1;
   long clr_gradSelected2_2;   
   long clr_textGrayed;
   long clr_gradGrayed1_1;
   long clr_gradGrayed1_2; 
   long clr_gradGrayed2_1; 
   long clr_gradGrayed2_2; 
   long clr_boxGrayed; 
   BYTE * byteChecked;
   enum fw_SKIN skin;
   int roundSize;
   BOOL bdrawGrayed;
   
} SKIN_MENU;

static HBITMAP hBmpCheck2015 = NULL;
static SKIN_MENU skinMenu;

HBITMAP Check2015( HDC hDC, BYTE * byteImg ) // ( hDC ) --> hBitmap
{
     if( hBmpCheck2015 == NULL )
        hBmpCheck2015 = CreateMemBitmap( hDC, ( LPSTR ) byteImg );
            
   return hBmpCheck2015;
}

void DelCheck2015( void )
{
     if( hBmpCheck2015 != NULL )
     {
         DelResource( hBmpCheck2015 );
        DeleteObject( hBmpCheck2015 );
        DelResource( hBmpCheck2015 );
        hBmpCheck2015 = NULL;
     }  
}

HB_FUNC( DELCHECK2015 )
{
   DelCheck2015();
} 

HB_FUNC( MENUDRAW2015 ) // ( pDrawItemStruct, cPrompt, hTopMenu, hBitmap, hWnd )
{
     #ifndef _WIN64 
      HMENU hTopMenu = ( HMENU ) hb_parnl( 3 );
      HBITMAP hBmp = ( HBITMAP ) hb_parnl( 4 );
      HWND hWnd = ( HWND ) hb_parnl( 5 );
      LPDRAWITEMSTRUCT lpdis = ( LPDRAWITEMSTRUCT ) hb_parnl( 1 );
   #else
      HMENU hTopMenu = ( HMENU ) hb_parnll( 3 );
      HBITMAP hBmp = ( HBITMAP ) hb_parnll( 4 );
      HWND hWnd = ( HWND ) hb_parnll( 5 );
      LPDRAWITEMSTRUCT lpdis = ( LPDRAWITEMSTRUCT ) hb_parnll( 1 );
   #endif
   
   LPSTR szPrompt = ( LPSTR ) hb_parc( 2 );
   BOOL bTab = bStrAt( 9, szPrompt );
   WORD wLen;
   HPEN hNormal;
   HBRUSH hBrush, holdBrush;
   LOGBRUSH lb;
   RECT rct;
   UINT uFormat;
   LONG top, left, bottom, right;
   HRGN hReg;
   HDC hdcMem;
   HBITMAP hbmp, holdBmp;

   static BOOL bVista = FALSE;

   if( ! hBmpCheck2015 )
   {
    OSVERSIONINFO vi;
      
      Check2015( lpdis->hDC, skinMenu.byteChecked );   

      ZeroMemory( &vi, sizeof( OSVERSIONINFO ) );
      vi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
      GetVersionEx( &vi );
      
      if( vi.dwMajorVersion == 6 ) // Vista
         bVista = TRUE;
   }      

   hReg = CreateRoundRectRgn( lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right, lpdis->rcItem.bottom, skinMenu.roundSize, skinMenu.roundSize );
   SetWindowRgn( lpdis->hwndItem, hReg, FALSE );
   DeleteObject( hReg );
   
   switch( lpdis->itemAction )
   {
      case ODA_DRAWENTIRE:
      case ODA_SELECT:
           if( hTopMenu == ( HMENU ) lpdis->hwndItem && ! ( lpdis->itemState & ODS_SELECTED ) )
           {
              POINT pt;

              GetClientRect( ( HWND ) hWnd, &rct ); 

              // Gradient for top menu 
              top = lpdis->rcItem.top;
              bottom = lpdis->rcItem.bottom;
              right = lpdis->rcItem.right;
                                                            
              if( GetPixel( lpdis->hDC, lpdis->rcItem.right + 2, lpdis->rcItem.top ) != RGB( 254, 254, 255 ) && 
                  GetPixel( lpdis->hDC, lpdis->rcItem.right + 2, lpdis->rcItem.top ) != RGB( 255, 255, 255 ) &&
                  GetPixel( lpdis->hDC, lpdis->rcItem.right + 2, lpdis->rcItem.top ) != RGB( 255, 248, 255 ) &&
                  GetPixel( lpdis->hDC, lpdis->rcItem.right + 2, lpdis->rcItem.top ) != RGB( 239, 240, 240 ) &&
                  GetPixel( lpdis->hDC, lpdis->rcItem.right + 2, lpdis->rcItem.top ) != RGB( 245, 254, 255 ) )
                  
                 lpdis->rcItem.right = rct.right + 3 + ( bVista ? 5 : 0 );
                 
              lpdis->rcItem.bottom = lpdis->rcItem.top + 8;
              Gradient( lpdis->hDC, &lpdis->rcItem, skinMenu.clr_gradBar1_1, skinMenu.clr_gradBar1_2, TRUE );
              
              lpdis->rcItem.top = lpdis->rcItem.bottom + 1;
              lpdis->rcItem.bottom = bottom;
              Gradient( lpdis->hDC, &lpdis->rcItem, RGB( 212, 219, 237 ), RGB( 225, 230, 246 ), TRUE );
              lpdis->rcItem.top = top;

              // bottom lines
              lb.lbStyle = BS_SOLID;
              lb.lbColor = RGB( 182, 188, 204 );
              hBrush = CreateBrushIndirect( &lb );
              rct.top = lpdis->rcItem.bottom - 1;
              rct.left = lpdis->rcItem.left;
              rct.bottom = lpdis->rcItem.bottom;
              rct.right = lpdis->rcItem.right;
              FillRect( lpdis->hDC, &rct, hBrush );
              DeleteObject( hBrush );

              lb.lbStyle = BS_SOLID;
              lb.lbColor =  bVista ? RGB( 240, 240, 240 ) : RGB( 255, 255, 255 );
              hBrush = CreateBrushIndirect( &lb );
              rct.top = lpdis->rcItem.bottom;
              rct.bottom = lpdis->rcItem.bottom + 1;
              FillRect( lpdis->hDC, &rct, hBrush );
              DeleteObject( hBrush );

              lpdis->rcItem.right = right;
           }      
      
           if( lpdis->itemState & ODS_SELECTED )
           {
              if( ! ( lpdis->itemState & ODS_GRAYED ) || skinMenu.bdrawGrayed )
              {
                 int iWidth, iHeight;
                 long lGrad1_1;
                 long lGrad1_2;
                 long lGrad2_1;
                 long lGrad2_2;
                 long lbox;
                    
                 if( skinMenu.bdrawGrayed && ( lpdis->itemState & ODS_GRAYED ) ){
                    lGrad1_1 = skinMenu.clr_gradGrayed1_1;
                    lGrad1_2 = skinMenu.clr_gradGrayed1_2;
                    lGrad2_1 = skinMenu.clr_gradGrayed2_1;
                    lGrad2_2 = skinMenu.clr_gradGrayed2_2;                      
                    lbox     = skinMenu.clr_boxGrayed;
                 }else {
                    lGrad1_1 = skinMenu.clr_gradSelected1_1;
                    lGrad1_2 = skinMenu.clr_gradSelected1_2;
                    lGrad2_1 = skinMenu.clr_gradSelected2_1;
                    lGrad2_2 = skinMenu.clr_gradSelected2_2;
                    lbox     = skinMenu.clr_box;
                 }
                 iWidth  =  lpdis->rcItem.right - lpdis->rcItem.left;
                 iHeight = lpdis->rcItem.bottom - lpdis->rcItem.top;
                 rct.top = 0;
                 rct.left = 0;
                 rct.bottom = iHeight;
                 rct.right = iWidth;
                 hdcMem = CreateCompatibleDC( lpdis->hDC );
                 hbmp   = CreateCompatibleBitmap( lpdis->hDC, iWidth, iHeight );
                 holdBmp = ( HBITMAP ) SelectObject( hdcMem, hbmp );                 
                 bottom = rct.bottom;
                 rct.bottom = iHeight / 2;
                 
                 Gradient( hdcMem, &rct, lGrad1_1, lGrad1_2, TRUE );
                 top = rct.top;
                 rct.top = rct.bottom + 1;
                 rct.bottom = bottom;
                 rct.bottom--;
                 Gradient( hdcMem, &rct, lGrad2_1, lGrad2_2, TRUE );
                 rct.top = top;
                 rct.bottom++;
                 lb.lbStyle = BS_PATTERN;
                 lb.lbHatch = ( ULONG_PTR ) hbmp;
                 hBrush = CreateBrushIndirect( &lb );
                 SetBrushOrgEx( lpdis->hDC, 0, lpdis->rcItem.top, NULL );
                 holdBrush = ( HBRUSH ) SelectObject( lpdis->hDC, hBrush );
                 BeginPath( lpdis->hDC );
                 RoundBox( lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right,
                          lpdis->rcItem.bottom, skinMenu.roundSize, skinMenu.roundSize, lbox, 1 );
                 EndPath( lpdis->hDC );
                 FillPath( lpdis->hDC );
                 RoundBox( lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, lpdis->rcItem.right,
                          lpdis->rcItem.bottom, skinMenu.roundSize, skinMenu.roundSize, lbox, 1 );                 
                 SelectObject( lpdis->hDC, holdBrush );
                 SelectObject( hdcMem, holdBmp );
                 DeleteObject( hBrush );
                 DeleteObject( hbmp );
                 DeleteDC( hdcMem );
              }   
           }
           else
           {
              if( hTopMenu != ( HMENU ) lpdis->hwndItem )
              {
                 // Draw left side
                 lb.lbStyle = BS_SOLID;
                 lb.lbColor = skinMenu.clr_leftSide;
                 hBrush = CreateBrushIndirect( &lb );
                 right = lpdis->rcItem.right;
                 lpdis->rcItem.right = lpdis->rcItem.left + 24;
                 FillRect( lpdis->hDC, &lpdis->rcItem, hBrush );
                 lpdis->rcItem.right = right;
                 DeleteObject( hBrush );
              
                 // Clean right side
                 lb.lbColor = skinMenu.clr_rightSide;
                 hBrush = CreateBrushIndirect( &lb );
                 left = lpdis->rcItem.left;
                 if( hTopMenu != ( HMENU ) lpdis->hwndItem )
                    lpdis->rcItem.left += 25;
                 FillRect( lpdis->hDC, &lpdis->rcItem, hBrush );
                 lpdis->rcItem.left = left;
                 DeleteObject( hBrush );
                 // Draw vertical line1
                 lb.lbStyle = BS_SOLID;
                 lb.lbColor = skinMenu.clr_vertical1;
                 hBrush = CreateBrushIndirect( &lb );
                 rct.top = lpdis->rcItem.top;
                 rct.left = lpdis->rcItem.left + 24;
                 rct.bottom = lpdis->rcItem.bottom;
                 rct.right = lpdis->rcItem.left + 25;
                 FillRect( lpdis->hDC, &rct, hBrush );
                 DeleteObject( hBrush );
                 
                 // Draw vertical line2
                 lb.lbColor = skinMenu.clr_vertical2;
                 hBrush = CreateBrushIndirect( &lb );
                 rct.top = lpdis->rcItem.top;
                 rct.left = lpdis->rcItem.left + 25;
                 rct.bottom = lpdis->rcItem.bottom;
                 rct.right = lpdis->rcItem.left + 26;
                 FillRect( lpdis->hDC, &rct, hBrush );
                 DeleteObject( hBrush );                    
                                  
              }   
           }   

           if( lpdis->itemState & ODS_CHECKED )
              DrawMasked( lpdis->hDC, hBmpCheck2015, ( WORD ) lpdis->rcItem.top, ( WORD ) ( lpdis->rcItem.left + 1 ) );

           if( hBmp )
           {
              if( ! ( lpdis->itemState & ODS_CHECKED ) )
                 DrawMasked( lpdis->hDC, hBmp, ( WORD ) ( lpdis->rcItem.top + 2 ),
                             ( WORD ) ( lpdis->rcItem.left + 4 ) );
              else
                 if( ! ( lpdis->itemState & ODS_SELECTED ) )
                    DrawGrayed( lpdis->hDC, hBmp, lpdis->rcItem.top + 1,
                                lpdis->rcItem.left + 1 );
                 else
                    DrawMasked( lpdis->hDC, hBmp, ( WORD ) ( lpdis->rcItem.top + 1 ),
                                ( WORD ) ( lpdis->rcItem.left + 1 ) );
           }

           lpdis->rcItem.top  += 2;
           
           if( hTopMenu != ( HMENU ) lpdis->hwndItem )
           {
              uFormat = DT_LEFT;
              lpdis->rcItem.left += 33;
           }   
           else   
              uFormat = DT_CENTER;
           
           SetBkMode( lpdis->hDC, TRANSPARENT );

           if( lpdis->itemState & ODS_GRAYED )
              SetTextColor( lpdis->hDC, skinMenu.clr_textGrayed );

           if( ! bTab )
           {
              if( strlen( szPrompt ) )
                 DrawText( lpdis->hDC, szPrompt, -1, &lpdis->rcItem, uFormat );
              else
              {   
                 if( ! HB_ISDIBitmap( lpdis ) )
                 {
                    // draw separator
                    lb.lbColor = skinMenu.clr_vertical1;
                    hBrush = CreateBrushIndirect( &lb );
                    lpdis->rcItem.top += 2;
                    lpdis->rcItem.bottom = lpdis->rcItem.top + 1;
                    rct.top = lpdis->rcItem.top ;
                    rct.left = lpdis->rcItem.left - 8;
                    rct.bottom = lpdis->rcItem.bottom;
                    rct.right = lpdis->rcItem.right;
                    if( hTopMenu != ( HMENU ) lpdis->hwndItem )
                       FillRect( lpdis->hDC, &rct, hBrush );
                    DeleteObject( hBrush );
                    
                    lb.lbColor = skinMenu.clr_vertical2;
                    hBrush = CreateBrushIndirect( &lb );
                    lpdis->rcItem.top ++;
                    lpdis->rcItem.bottom = lpdis->rcItem.top + 1;
                    rct.top = lpdis->rcItem.top ;
                    rct.left = lpdis->rcItem.left - 8;
                    rct.bottom = lpdis->rcItem.bottom;
                    rct.right = lpdis->rcItem.right;
                    if( hTopMenu != ( HMENU ) lpdis->hwndItem )
                       FillRect( lpdis->hDC, &rct, hBrush );
                    DeleteObject( hBrush );                    
                    
                 }   
              }
           }      
           else
           {
              lpdis->rcItem.right -= 21;
              StrToken( szPrompt, 1, 9, &wLen ); // 32 bits does not fill wLen before
              DrawText( lpdis->hDC, StrToken( szPrompt, 1, 9, &wLen ), wLen, &lpdis->rcItem, DT_LEFT );
              StrToken( szPrompt, 2, 9, &wLen ); // 32 bits does not fill wLen before
              DrawText( lpdis->hDC, StrToken( szPrompt, 2, 9, &wLen ), wLen, &lpdis->rcItem, DT_RIGHT );
              lpdis->rcItem.right += 21;
           }

           hb_retl( TRUE );
           break;

      case ODA_FOCUS:
           hb_retl( FALSE );
           break;
   }
}

//----------------------------------------------------------------------------//

#ifndef MIIM_FTYPE
   #define MIIM_FTYPE 0x00000100
#endif

HB_FUNC( MITEMS2015 ) // hMenu
{
     #ifdef _WIN64 
        HMENU hMenu = ( HMENU ) hb_parnll( 1 );
     #else
        HMENU hMenu = ( HMENU ) hb_parnl( 1 );
     #endif   
   WORD w;
   MENUITEMINFO mi;

   for( w = 0; w < GetMenuItemCount( hMenu ); w++ )
   {
      memset( ( char * ) &mi, 0, sizeof( MENUITEMINFO ) );
      mi.cbSize = sizeof( MENUITEMINFO );
      mi.fMask = MIIM_FTYPE;
      GetMenuItemInfo( hMenu, w, TRUE, &mi );

      if( ( mi.fType & MFT_OWNERDRAW ) != MFT_OWNERDRAW )
      {
         mi.cbSize = sizeof( MENUITEMINFO );
         mi.fMask = ( MIIM_FTYPE | MIIM_DATA );
         mi.fType |= MFT_OWNERDRAW;
         mi.dwItemData = ( DWORD ) hMenu;
         SetMenuItemInfo( hMenu, w, TRUE, &mi );
      } 
   }
}
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 838
Joined: Wed Aug 22, 2007 10:09 AM
Re: funcionalidad para Fivewin
Posted: Fri May 08, 2015 10:53 AM

Antonio,

Yo uso VMWARE por lo que sí me funciona Windows 10.

Si te parece, me envías un ejemplo completo, lo pruebo y te digo feedback.

Un saludo

Saludos / Regards,



FWH 20.04, Harbour 3.2.0 dev (r1909261630) y BCC 7.40
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: funcionalidad para Fivewin
Posted: Fri May 08, 2015 02:26 PM

Moisés,

No me refiero a ejecutar Windows 10 en VirtualBox ó vmware, sino al reves, desde Windows 10 ejecutar VirtualBox.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: funcionalidad para Fivewin
Posted: Sun May 17, 2015 10:30 AM
Antonio
Faltaria la funcion SetSkin2015 y la variable Check2015Bytes[] ?



Y para que no generase un GPF:
Code (fw): Select all Collapse
.../...
   if( ! hBmpCheck2015 )
   {
    OSVERSIONINFO vi;

      if ( skinMenu.byteChecked != NULL )
         Check2015( lpdis->hDC, skinMenu.byteChecked );

.../...
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 6755
Joined: Wed Feb 15, 2012 08:25 PM
Re: funcionalidad para Fivewin
Posted: Sun May 17, 2015 01:37 PM
Algo asi?



Como es el bitmap que se utiliza para marcar los items?
En la imagen que has puesto no se ve ninguno
Cristobal Navarro

Hay dos tipos de personas: las que te hacen perder el tiempo y las que te hacen perder la noción del tiempo

El secreto de la felicidad no está en hacer lo que te gusta, sino en que te guste lo que haces
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: funcionalidad para Fivewin
Posted: Mon May 18, 2015 07:18 AM

Cristobal,

Te envío por email el fichero original desde el cual he creado menudraw.c :-)

gracias por tu ayuda!

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44158
Joined: Thu Oct 06, 2005 05:47 PM
Re: funcionalidad para Fivewin
Posted: Tue May 19, 2015 03:30 PM

Moisés,

Con la gran ayuda de Cristobal, ya está preparado el nuevo estilo 2015 para los menues.

Te envío las librerías para que lo pruebes, gracias :-)

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 838
Joined: Wed Aug 22, 2007 10:09 AM
Re: funcionalidad para Fivewin
Posted: Thu May 21, 2015 08:36 AM

Antonio:

Lo estamos probando. Muchas gracias. Te informo del resultado.

Saludos / Regards,



FWH 20.04, Harbour 3.2.0 dev (r1909261630) y BCC 7.40

Continue the discussion