2010-07-16 02:52 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)

* contrib/hbqt/doc/en/class_hbqplaintextedit.txt
  * contrib/hbqt/hbqt_hbqplaintextedit.cpp
  * contrib/hbqt/hbqt_hbqplaintextedit.h
  * contrib/hbqt/qtgui/HBQPlainTextEdit.cpp
  * contrib/hbqt/qtgui/THBQPlainTextEdit.prg
  * contrib/hbqt/qth/HBQPlainTextEdit.qth
    + Added: :hbSelectAll() method.

  * contrib/hbxbp/xbpbrowse.prg
    ! Minor.

  + contrib/hbide/fetchdate.ui
    + Added: dialog to fetch a date value. It also employs calender widget.

  * contrib/hbide/ideedit.prg
    ! Fixed: many artifacts related to selection behaviour.

  * contrib/hbide/idemisc.prg
  * contrib/hbide/idebrowse.prg
    + Implemented: search in the current browser.
      Search is available in two modes:

         1. When table has some index active : DbSeek() is performed.
               The value to seek is based on the type returned by valtype( &( IndexKey() ) ).
         2. When table has no active index: sequential search is performed.
               The value of search is based on the current highlighted cell.

      Input dialog is presented depending upon the search variable type.
      Sequential search is a slow process but there is no alternative to that.
      Sequential search is initiated from the current record downwards and terminated 
         either on oBrw:hitBottom is encountered or value is found.

      Icon: ideDBU toolbar-serach        Hotkey: CTRL+F

    + Implemented: goto record. It is straight forward. DbGoto( nRecord ) is issued.
   
      Icon: ideDBU toolbar-goto record   Hotkey: CTRL+G      

      Please forward your opinions.
This commit is contained in:
Pritpal Bedi
2010-07-16 10:07:19 +00:00
parent ef16143d1e
commit 8ea00d299c
12 changed files with 297 additions and 36 deletions

View File

@@ -16,6 +16,47 @@
The license applies to all entries newer than 2009-04-28.
*/
2010-07-16 02:52 UTC-0800 Pritpal Bedi (bedipritpal@hotmail.com)
* contrib/hbqt/doc/en/class_hbqplaintextedit.txt
* contrib/hbqt/hbqt_hbqplaintextedit.cpp
* contrib/hbqt/hbqt_hbqplaintextedit.h
* contrib/hbqt/qtgui/HBQPlainTextEdit.cpp
* contrib/hbqt/qtgui/THBQPlainTextEdit.prg
* contrib/hbqt/qth/HBQPlainTextEdit.qth
+ Added: :hbSelectAll() method.
* contrib/hbxbp/xbpbrowse.prg
! Minor.
+ contrib/hbide/fetchdate.ui
+ Added: dialog to fetch a date value. It also employs calender widget.
* contrib/hbide/ideedit.prg
! Fixed: many artifacts related to selection behaviour.
* contrib/hbide/idemisc.prg
* contrib/hbide/idebrowse.prg
+ Implemented: search in the current browser.
Search is available in two modes:
1. When table has some index active : DbSeek() is performed.
The value to seek is based on the type returned by valtype( &( IndexKey() ) ).
2. When table has no active index: sequential search is performed.
The value of search is based on the current highlighted cell.
Input dialog is presented depending upon the search variable type.
Sequential search is a slow process but there is no alternative to that.
Sequential search is initiated from the current record downwards and terminated
either on oBrw:hitBottom is encountered or value is found.
Icon: ideDBU toolbar-serach Hotkey: CTRL+F
+ Implemented: goto record. It is straight forward. DbGoto( nRecord ) is issued.
Icon: ideDBU toolbar-goto record Hotkey: CTRL+G
Please forward your opinions.
2010-07-16 08:16 UTC+0200 Viktor Szakats (harbour.01 syenar.hu)
* contrib/hbqt/tests/testqaim.prg
! Two fixes reported by Tamas and Bacco respectively.

View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>DialogDate</class>
<widget class="QDialog" name="DialogDate">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>194</width>
<height>104</height>
</rect>
</property>
<property name="windowTitle">
<string>Fetch a date</string>
</property>
<widget class="QDateEdit" name="editDate">
<property name="geometry">
<rect>
<x>14</x>
<y>30</y>
<width>161</width>
<height>22</height>
</rect>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
<widget class="QPushButton" name="buttonOk">
<property name="geometry">
<rect>
<x>14</x>
<y>68</y>
<width>75</width>
<height>24</height>
</rect>
</property>
<property name="text">
<string>OK</string>
</property>
</widget>
<widget class="QPushButton" name="buttonCancel">
<property name="geometry">
<rect>
<x>102</x>
<y>68</y>
<width>75</width>
<height>24</height>
</rect>
</property>
<property name="text">
<string>Cancel</string>
</property>
</widget>
<widget class="QLabel" name="labelPrompt">
<property name="geometry">
<rect>
<x>14</x>
<y>8</y>
<width>159</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Select a date</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>

View File

@@ -498,6 +498,18 @@ METHOD IdeBrowseManager:execEvent( cEvent, p, p1, p2 )
::populateFieldData()
EXIT
CASE "buttonFind_clicked"
IF !empty( ::oCurBrw )
::oCurBrw:searchAsk()
ENDIF
EXIT
CASE "buttonGoto_clicked"
IF !empty( ::oCurBrw )
::oCurBrw:gotoAsk()
ENDIF
EXIT
ENDSWITCH
#if 0
@@ -718,7 +730,11 @@ METHOD IdeBrowseManager:buildToolbar()
::buildToolButton( { "Close current table", "dc_delete" , "clicked()", {|| ::execEvent( "buttonClose_clicked" ) }, .f. } )
::buildToolButton( {} )
::buildToolButton( { "Table Structure" , "dbstruct" , "clicked()", {|| ::execEvent( "buttonDbStruct_clicked" ) }, .f. } )
::buildToolButton( {} )
::buildIndexButton()
::buildToolButton( { "Search in table" , "find" , "clicked()", {|| ::execEvent( "buttonFind_clicked" ) }, .f. } )
::buildToolButton( { "Goto record" , "gotoline" , "clicked()", {|| ::execEvent( "buttonGoto_clicked" ) }, .f. } )
::buildToolButton( {} )
RETURN Self
@@ -1057,6 +1073,8 @@ CLASS IdeBrowse INHERIT IdeObject
DATA qForm
DATA qFLayout
DATA qSplitter
DATA qTimer
DATA aForm INIT {}
DATA oManager
DATA oPanel
@@ -1082,6 +1100,9 @@ CLASS IdeBrowse INHERIT IdeObject
DATA qClose
DATA aIndex INIT {}
DATA xSearch
DATA lInSearch INIT .f.
METHOD new( oIde, oManager, oPanel, aInfo )
METHOD create( oIde, oManager, oPanel, aInfo )
METHOD configure()
@@ -1106,6 +1127,7 @@ CLASS IdeBrowse INHERIT IdeObject
METHOD indexOrd()
METHOD ordName( nOrder )
METHOD IndexKey( nOrder )
METHOD IndexKeyValue( nOrder )
METHOD setOrder( nOrder )
METHOD refreshAll()
METHOD getIndexInfo()
@@ -1151,7 +1173,7 @@ METHOD IdeBrowse:create( oIde, oManager, oPanel, aInfo )
aSize( ::aInfo, TBL_VRBLS )
DEFAULT ::aInfo[ TBL_PANEL ] TO ::oPanel:cName
DEFAULT ::aInfo[ TBL_PANEL ] TO ::oPanel:cPanel
DEFAULT ::aInfo[ TBL_NAME ] TO ""
DEFAULT ::aInfo[ TBL_ALIAS ] TO ""
DEFAULT ::aInfo[ TBL_DRIVER ] TO ::oManager:qRddCombo:currentText()
@@ -1219,13 +1241,17 @@ METHOD IdeBrowse:create( oIde, oManager, oPanel, aInfo )
::oBrw:colPos := val( aInfo[ TBL_COLPOS ] )
::oBrw:forceStable()
::setOrder( val( aInfo[ TBL_INDEX ] ) )
::goto( val( aInfo[ TBL_RECORD ] ) )
::goto( max( 1, val( aInfo[ TBL_RECORD ] ) ) )
::oBrw:refreshAll()
::oBrw:forceStable()
::oBrw:navigate := {|mp1,mp2| ::execEvent( "browse_navigate", mp1, mp2 ) }
::oBrw:keyboard := {|mp1,mp2| ::execEvent( "browse_keyboard", mp1, mp2 ) }
::qTimer := QTimer():new()
::qTimer:setInterval( 10 )
::connect( ::qTimer, "timeout()", {|| ::execEvent( "timer_timeout" ) } )
RETURN Self
/*----------------------------------------------------------------------*/
@@ -1356,6 +1382,16 @@ METHOD IdeBrowse:execEvent( cEvent, p, p1 )
ENDIF
EXIT
CASE "timer_timeout"
::oBrw:down()
IF ::oBrw:hitBottom
::qTimer:stop()
ENDIF
IF eval( ::oBrw:getColumn( ::oBrw:colPos ):block ) == ::xSearch
::qTimer:stop()
ENDIF
EXIT
ENDSWITCH
RETURN Self
@@ -1569,12 +1605,33 @@ METHOD IdeBrowse:previous()
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:searchAsk()
LOCAL cSearch
LOCAL xValue, xSearch, nOrd, cFor
IF !empty( cSearch := hbide_fetchAString( ::oWnd:oWidget, "", ::aStruct[ ::oBrw:colPos, 1 ], "Search" ) )
::search( cSearch )
IF ( nOrd := ::indexOrd() ) > 0
xValue := ::indexKeyValue()
ELSE
xValue := eval( ::oBrw:getColumn( ::oBrw:colPos ):block )
ENDIF
cFor := iif( nOrd > 0, "Indexed: " + ::indexKey(), ::aStruct[ ::oBrw:colPos, 1 ] )
SWITCH valtype( xValue )
CASE 'C'
IF !empty( xSearch := ( QInputDialog():new() ):getText( ::oWnd:oWidget, "Search for?", cFor ) )
::search( xSearch )
ENDIF
EXIT
CASE 'N'
xSearch := ( QInputDialog():new() ):getDouble( ::oWnd:oWidget, "Search for?", cFor, ;
0, -2147483647, 2147483647, iif( nOrd > 0, 3, ::aStruct[ ::oBrw:colPos, 4 ] ) )
::search( xSearch )
EXIT
CASE 'D'
xSearch := hbide_fetchADate( ::oWnd:oWidget, "Search for?", cFor )
::search( xSearch )
EXIT
ENDSWITCH
RETURN Self
/*----------------------------------------------------------------------*/
@@ -1594,7 +1651,12 @@ METHOD IdeBrowse:search( cSearch )
MsgBox( "Could not find: " + cSearch )
ENDIF
ELSE
// Sequential search
IF ::lInSearch
::qTimer:stop()
ENDIF
::xSearch := cSearch
::lInSearch := .t.
::qTimer:start()
ENDIF
ENDIF
ELSE
@@ -1610,6 +1672,7 @@ METHOD IdeBrowse:refreshAll()
::oBrw:refreshAll()
::oBrw:forceStable()
::oBrw:setCurrentIndex( .t. )
::dispInfo()
RETURN Self
@@ -1618,7 +1681,7 @@ METHOD IdeBrowse:refreshAll()
METHOD IdeBrowse:goToAsk()
LOCAL nRec
IF ! empty( nRec := ( QInputDialog():new() ):getInt( , "Goto", "Record_# ?", , ::recno() ) )
IF ! empty( nRec := ( QInputDialog():new() ):getInt( , "Goto", "Record_# ?", ::recno(), 1, ::lastrec() ) )
::goto( nRec )
::refreshAll()
ENDIF
@@ -1750,6 +1813,17 @@ METHOD IdeBrowse:ordName( nOrder )
/*----------------------------------------------------------------------*/
METHOD IdeBrowse:indexKeyValue( nOrder )
LOCAL xValue
IF ::nType == BRW_TYPE_DBF
xValue := ( ::cAlias )->( &( IndexKey( nOrder ) ) )
ENDIF
RETURN xValue
/*------------------------------------------------------------------------*/
METHOD IdeBrowse:indexKey( nOrder )
DEFAULT nOrder TO ::indexOrd()

View File

@@ -994,13 +994,14 @@ METHOD IdeEdit:deleteBlockContents( aCord )
nW := nR - nL
IF nW == 0 .AND. k == Qt_Key_Backspace
FOR i := nT TO nB
cLine := ::getLine( i + 1 )
cLine := pad( substr( cLine, 1, nL - 1 ), nL - 1 ) + substr( cLine, nL + 1 )
hbide_qReplaceLine( qCursor, i, cLine )
NEXT
hbide_qPositionCursor( qCursor, nB, nR - 1 )
IF nSelMode == selectionMode_column
FOR i := nT TO nB
cLine := ::getLine( i + 1 )
cLine := pad( substr( cLine, 1, nL - 1 ), nL - 1 ) + substr( cLine, nL + 1 )
hbide_qReplaceLine( qCursor, i, cLine )
NEXT
hbide_qPositionCursor( qCursor, nB, nR - 1 )
ENDIF
ELSE
IF k == Qt_Key_Delete .OR. k == Qt_Key_X
IF nSelMode == selectionMode_column
@@ -1416,7 +1417,7 @@ METHOD IdeEdit:paste()
/*----------------------------------------------------------------------*/
METHOD IdeEdit:selectAll()
::qEdit:selectAll()
::qEdit:hbSelectAll()
RETURN Self
/*----------------------------------------------------------------------*/

View File

@@ -1217,12 +1217,49 @@ FUNCTION hbide_getOS()
/*----------------------------------------------------------------------*/
FUNCTION hbide_fetchADate( qParent, cTitle, cPrompt, dDefault )
LOCAL qDate, oUI, pSlots, nRet
DEFAULT cTitle TO "A Date Value"
DEFAULT cPrompt TO "What"
pSlots := hbxbp_getSlotsPtr()
oUI := hbide_getUI( "fetchdate", qParent )
oUI:setWindowTitle( cTitle )
oUI:q_labelPrompt:setText( cPrompt )
IF dDefault != NIL
qDate := QDate():new()
qDate:setYear( year( dDefault ) )
qDate:setMonth( month( dDefault ) )
qDate:setDay( day( dDefault ) )
oUI:q_editDate:setDate( qDate )
ENDIF
Qt_Slots_connect( pSlots, oUI:q_buttonOk , "clicked()", {|| oUI:done( 1 ) } )
Qt_Slots_connect( pSlots, oUI:q_buttonCancel, "clicked()", {|| oUI:done( 0 ) } )
nRet := oUI:exec()
Qt_Slots_disconnect( pSlots, oUI:q_buttonOk )
Qt_Slots_disconnect( pSlots, oUI:q_buttonCancel )
IF nRet == 1
qDate := QDate():from( oUI:q_editDate:date() )
RETURN stod( strzero( qDate:year(), 4 ) + strzero( qDate:month(),2 ) + strzero( qDate:day(), 2 ) )
ENDIF
RETURN NIL
/*------------------------------------------------------------------------*/
FUNCTION hbide_fetchAString( qParent, cDefault, cWhat, cTitle )
LOCAL qGo
DEFAULT cDefault TO ""
DEFAULT cWhat TO ""
DEFAULT cTitle TO "A String Value Please"
DEFAULT cTitle TO "A String Value"
qGo := QInputDialog():new( qParent )
qGo:setTextValue( cDefault )
@@ -2062,6 +2099,9 @@ FUNCTION hbide_getUI( cUI, qParent )
CASE "dbstruct"
oUI := iif( nModeUI == UI_MODE_FUNC, hbqtui_DbStruct( qParent ), NIL )
EXIT
CASE "fetchdate"
oUI := iif( nModeUI == UI_MODE_FUNC, hbqtui_FetchDate( qParent ), NIL )
EXIT
ENDSWITCH
IF empty( oUI )

View File

@@ -79,6 +79,7 @@
:hbTogglePersistentSelection() -> NIL
:hbHorzRulerVisible( lVisible ) -> NIL
:hbSetProtoStyle( cCss ) -> NIL
:hbSelectAll() -> NIL
$DESCRIPTION$

View File

@@ -392,6 +392,21 @@ void HBQPlainTextEdit::hbClearSelection()
/*----------------------------------------------------------------------*/
void HBQPlainTextEdit::hbSelectAll()
{
setCursorWidth( 1 );
rowBegins = 0;
rowEnds = document()->blockCount();
columnBegins = 0;
columnEnds = 0;
emit selectionChanged();
repaint();
}
/*----------------------------------------------------------------------*/
void HBQPlainTextEdit::hbHitTest( const QPoint & pt )
{
QTextCursor ct = cursorForPosition( QPoint( 2,2 ) );
@@ -1041,31 +1056,25 @@ bool HBQPlainTextEdit::hbKeyPressSelectionByApplication( QKeyEvent * event )
bool HBQPlainTextEdit::hbKeyPressSelection( QKeyEvent * event )
{
bool ctrl = event->modifiers() & Qt::ControlModifier;
bool shift = event->modifiers() & Qt::ShiftModifier;
if( ctrl && shift )
return false;
int k = event->key();
if( ctrl && event->text().isEmpty() )
{
#if 0
event->ignore();
return true;
#endif
bool ctrl = event->modifiers() & Qt::ControlModifier;
bool shift = event->modifiers() & Qt::ShiftModifier;
if( ctrl && shift && ! isNavableKey( k ) ) {
return false;
}
if( ctrl && event->text().isEmpty() && ! isNavableKey( k ) ) {
return false;
}
if( ctrl && ( k == Qt::Key_C || k == Qt::Key_V || k == Qt::Key_X ||
k == Qt::Key_A || k == Qt::Key_Z || k == Qt::Key_Y ) )
{
k == Qt::Key_A || k == Qt::Key_Z || k == Qt::Key_Y ) ) {
event->ignore();
return true;
}
if( isSelectionByApplication )
{
if( isSelectionByApplication ) {
return hbKeyPressSelectionByApplication( event );
}
@@ -1104,7 +1113,7 @@ bool HBQPlainTextEdit::hbKeyPressSelection( QKeyEvent * event )
repaint();
}
QKeyEvent * ev = new QKeyEvent( event->type(), event->key(), Qt::NoModifier, event->text() );
QKeyEvent * ev = new QKeyEvent( event->type(), event->key(), ctrl ? Qt::ControlModifier : Qt::NoModifier, event->text() );
keyPressEvent( ev );
return true;
}
@@ -1243,13 +1252,15 @@ bool HBQPlainTextEdit::hbKeyPressSelection( QKeyEvent * event )
event->accept();
return true;
}
else if( ! ctrl && k == Qt::Key_Delete && columnBegins >= 0 && selectionState > 0 && ( selectionMode == selectionMode_stream || selectionMode == selectionMode_line ) )
else if( ! ctrl && ( k == Qt::Key_Backspace || k == Qt::Key_Delete ) && columnBegins >= 0 && selectionState > 0 && ( selectionMode == selectionMode_stream || selectionMode == selectionMode_line ) )
{
hbCut( k );
hbCut( Qt::Key_Delete );
repaint();
selectionState = 0;
event->accept();
return true;
if( k == Qt::Key_Delete ){
event->accept();
return true;
}
}
else if( ! ctrl && k >= ' ' && k < 127 && columnBegins >= 0 && selectionMode == selectionMode_stream ) //selectionState > 0
{

View File

@@ -213,6 +213,7 @@ public slots:
void hbTogglePersistentSelection();
void hbHorzRulerVisible( bool visible ) { hbUpdateHorzRulerHeight( visible ? 20 : 0 ); };
void hbSetProtoStyle( const QString & css = "" );
void hbSelectAll();
private slots:
void hbSlotCursorPositionChanged();

View File

@@ -876,6 +876,20 @@ HB_FUNC( QT_HBQPLAINTEXTEDIT_HBSETPROTOSTYLE )
}
}
/*
* void hbSelectAll()
*/
HB_FUNC( QT_HBQPLAINTEXTEDIT_HBSELECTALL )
{
HBQPlainTextEdit * p = hbqt_par_HBQPlainTextEdit( 1 );
if( p )
( p )->hbSelectAll();
else
{
HB_TRACE( HB_TR_DEBUG, ( "............................... F=QT_HBQPLAINTEXTEDIT_HBSELECTALL FP=( p )->hbSelectAll(); p is NULL" ) );
}
}
/*----------------------------------------------------------------------*/
#endif /* #if QT_VERSION >= 0x040500 */

View File

@@ -118,6 +118,7 @@ CREATE CLASS HBQPlainTextEdit INHERIT HbQtObjectHandler, QPlainTextEdit
METHOD hbTogglePersistentSelection()
METHOD hbHorzRulerVisible( lVisible )
METHOD hbSetProtoStyle( cCss )
METHOD hbSelectAll()
ENDCLASS
@@ -334,3 +335,7 @@ METHOD HBQPlainTextEdit:hbHorzRulerVisible( lVisible )
METHOD HBQPlainTextEdit:hbSetProtoStyle( cCss )
RETURN Qt_HBQPlainTextEdit_hbSetProtoStyle( ::pPtr, cCss )
METHOD HBQPlainTextEdit:hbSelectAll()
RETURN Qt_HBQPlainTextEdit_hbSelectAll( ::pPtr )

View File

@@ -149,6 +149,7 @@ HB_FUNC( QT_HBQPLAINTEXTEDIT )
void hbTogglePersistentSelection()
void hbHorzRulerVisible( bool visible )
void hbSetProtoStyle( const QString & css )
void hbSelectAll()
</SLOTS>

View File

@@ -657,6 +657,7 @@ METHOD XbpBrowse:create( oParent, oOwner, aPos, aSize, aPresParams, lVisible )
::oTableView:setGridStyle( ::gridStyle ) /* to be based on column definition */
::oTableView:setSelectionMode( QAbstractItemView_SingleSelection )
::oTableView:setSelectionBehavior( IF( ::cursorMode == XBPBRW_CURSOR_ROW, QAbstractItemView_SelectRows, QAbstractItemView_SelectItems ) )
::oTableView:setAlternatingRowColors( .t. )
/* Connect Keyboard Events */
::connect( ::oTableView, "keyPressEvent()" , {|p | ::execSlot( __ev_keypress__ , p ) } )