diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 37b136e6d1..7b9aad74a8 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,6 +17,20 @@ past entries belonging to author(s): Viktor Szakats. */ +2010-01-13 18:19 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com) + * contrib/hbide/ideeditor.prg + * contrib/hbide/idemisc.prg + * contrib/hbide/ideobject.prg + * contrib/hbide/idesources.prg + + Implemented line numbers in editing objects. + I used a very simplified way to achieve which + otherwise is implemented in altogether different ways + in Qt examples scattered over the net. + + + Thoughly reworked Edit engine. Please text. + + TODO: Synchronize method definitions with declarations. + 2010-01-14 02:47 UTC+0100 Viktor Szakats (harbour.01 syenar.hu) * contrib/hbqt/generator/hbqtgen.prg * contrib/hbqt/qth/QSyntaxHighlighter.qth diff --git a/harbour/contrib/hbide/ideeditor.prg b/harbour/contrib/hbide/ideeditor.prg index e3f86fd06b..a440324828 100644 --- a/harbour/contrib/hbide/ideeditor.prg +++ b/harbour/contrib/hbide/ideeditor.prg @@ -84,6 +84,8 @@ #define blockCountChanged 21 #define contentsChanged 22 +#define EDT_LINNO_WIDTH 50 + /*----------------------------------------------------------------------*/ CLASS IdeEditsManager INHERIT IdeObject @@ -260,7 +262,6 @@ METHOD IdeEditsManager:exeBlock( nMode, p ) METHOD IdeEditsManager:buildEditor( cSourceFile, nPos, nHPos, nVPos, cTheme ) - //aadd( ::aEdits, IdeEditor():new():create( ::oIde, cSourceFile, nPos, nHPos, nVPos, cTheme ) ) IdeEditor():new():create( ::oIde, cSourceFile, nPos, nHPos, nVPos, cTheme ) RETURN Self @@ -650,6 +651,7 @@ METHOD IdeEditsManager:goto() /*----------------------------------------------------------------------*/ // // CLASS IdeEditor +// Holds One Document in One Tab // /*----------------------------------------------------------------------*/ @@ -661,7 +663,6 @@ CLASS IdeEditor INHERIT IdeObject DATA cExt INIT "" DATA cType INIT "" DATA cTheme INIT "" - DATA qEdit DATA qDocument DATA qHiliter DATA sourceFile INIT "" @@ -669,6 +670,11 @@ CLASS IdeEditor INHERIT IdeObject DATA qLayout DATA lLoaded INIT .F. + DATA aEdits INIT {} /* Hold IdeEdit Objects */ + DATA oEdit + DATA qEdit + DATA qCurEditSplit + DATA nBlock INIT -1 DATA nColumn INIT -1 DATA nBlocks INIT 0 @@ -687,24 +693,17 @@ CLASS IdeEditor INHERIT IdeObject DATA nnRow INIT -99 DATA qPoint INIT QPoint():new() - DATA qCurEditSplit - METHOD new() METHOD create() METHOD destroy() METHOD buildTabPage() - METHOD buildEditor() - METHOD removeTabPage() METHOD activateTab() METHOD dispEditInfo() METHOD setTabImage() METHOD applyTheme() METHOD setDocumentProperties() - METHOD exeBlock() METHOD split() - METHOD connectEditSlots() - METHOD disConnectEditSlots() ENDCLASS @@ -731,162 +730,6 @@ METHOD IdeEditor:new( oIde, cSourceFile, nPos, nHPos, nVPos, cTheme ) /*----------------------------------------------------------------------*/ -METHOD IdeEditor:buildEditor( nMode ) - LOCAL qEdit - - qEdit := QPlainTextEdit():new() - // - qEdit:setLineWrapMode( QTextEdit_NoWrap ) - qEdit:setFont( ::oFont:oWidget ) - qEdit:ensureCursorVisible() - qEdit:setContextMenuPolicy( Qt_CustomContextMenu ) - - qEdit:setProperty( "SPLITTED", QVariant():new( iif( nMode == 0, "NO", "YES" ) ) ) - qEdit:setPlainText( " " ) - - ::connectEditSlots( qEdit ) - - RETURN qEdit - -/*----------------------------------------------------------------------*/ - -METHOD IdeEditor:disConnectEditSlots( qEdit ) - - ::disConnect( qEdit, "customContextMenuRequested(QPoint)" ) - ::disConnect( qEdit, "textChanged()" ) - ::disConnect( qEdit, "copyAvailable(bool)" ) - ::disConnect( qEdit, "modificationChanged(bool)" ) - ::disConnect( qEdit, "redoAvailable(bool)" ) - ::disConnect( qEdit, "selectionChanged()" ) - * ::disConnect( qEdit, "undoAvailable(bool)" ) - ::disConnect( qEdit, "updateRequest(QRect,int)" ) - ::disConnect( qEdit, "cursorPositionChanged()" ) - - RETURN Self - -/*----------------------------------------------------------------------*/ - -METHOD IdeEditor:connectEditSlots( qEdit ) - - ::Connect( qEdit, "updateRequest(QRect,int)" , {|o,p,p1| ::exeBlock( 8, o, p, p1 ) } ) - ::connect( qEdit, "customContextMenuRequested(QPoint)", {|o,p | ::exeBlock( 1, o, p ) } ) - ::Connect( qEdit, "textChanged()" , {|o | ::exeBlock( 2, o ) } ) - ::Connect( qEdit, "copyAvailable(bool)" , {|o,p | ::exeBlock( 3, o, p ) } ) - ::Connect( qEdit, "modificationChanged(bool)" , {|o,p | ::exeBlock( 4, o, p ) } ) - ::Connect( qEdit, "redoAvailable(bool)" , {|o,p | ::exeBlock( 5, o, p ) } ) - ::Connect( qEdit, "selectionChanged()" , {|o,p | ::exeBlock( 6, o, p ) } ) - * ::Connect( qEdit, "undoAvailable(bool)" , {|o,p | ::exeBlock( 7, o, p ) } ) - ::Connect( qEdit, "cursorPositionChanged()" , {|o | ::exeBlock( 9, o ) } ) - - RETURN Self - -/*----------------------------------------------------------------------*/ - -METHOD IdeEditor:exeBlock( nMode, o, p, p1 ) - LOCAL pAct, qAct, n, qEdit - #if 0 - LOCAL pCursor, qCursor - #endif - - STATIC lCont := .t. - - HB_SYMBOL_UNUSED( p1 ) - - IF !hbqt_IsEqualGcQtPointer( ::qEdit:pPtr, o ) - RETURN nil - ENDIF - - IF lCont - lCont := .f. - ENDIF - - IF nMode <= 9 - qEdit := QPlainTextEdit():configure( o ) - ENDIF - - SWITCH nMode - - /* QPlainTextEdit */ - CASE customContextMenuRequested - - IF !empty( pAct := ::oEM:qContextMenu:exec_1( qEdit:mapToGlobal( p ) ) ) - qAct := QAction():configure( pAct ) - DO CASE - CASE qAct:text() == "Split Horizontally" - ::split( 1, qEdit ) - CASE qAct:text() == "Split Vertically" - ::split( 2, qEdit ) - CASE qAct:text() == "Close Split Window" - IF ( n := ascan( ::aSplits, {|oo| hbqt_IsEqualGcQtPointer( oo:pPtr, o ) } ) ) > 0 - ::qLayout:removeWidget( qEdit ) - ::aSplits[ n ]:close() - ::aSplits[ n ]:pPtr := 0 - qEdit:pPtr := 0 - hb_adel( ::aSplits, n, .t. ) - ENDIF - CASE qAct:text() == "Apply Theme" - ::applyTheme() - ENDCASE - ENDIF - EXIT - CASE textChanged - ::setTabImage( qEdit ) - EXIT - CASE copyAvailable - hbide_dbg( "copyAvailable(bool)" ) - EXIT - CASE modificationChanged - hbide_dbg( "modificationChanged(bool)" ) - EXIT - CASE redoAvailable - hbide_dbg( "redoAvailable(bool)" ) - EXIT - CASE selectionChanged - ::qCurEditSplit := qEdit - hbide_dbg( "selectionChanged()" ) - EXIT - CASE undoAvailable - hbide_dbg( "undoAvailable(bool)" ) - EXIT - CASE updateRequest - #if 0 -hbide_dbg( 11000, p1 ) - pCursor := qEdit:cursorForPosition( ::qPoint ) -hbide_dbg( 11001, pCursor ) - IF hb_isPointer( pCursor ) -hbide_dbg( 11002 ) - qCursor := QTextCursor():configure( pCursor ) - ::xD := qCursor:blockNumber() - IF ::nnRow != ::xD + 1 - ::nnRow := ::xD + 1 - ::qLineNos:setText( hbide_buildLinesLabel( ::nnRow, 30, 4 ) )//, ; - // QTextDocument():configure( qEdit:document() ):blockCount() ) ) - ENDIF -hbide_dbg( "exit................" ) - ENDIF - #endif - EXIT - CASE cursorPositionChanged - ::dispEditInfo( qEdit ) - EXIT - - /* QTextDocument */ - CASE blockCountChanged - ::nBlock := QTextDocument():configure( o ):blockCount() - EXIT - CASE contentsChanged - hbide_dbg( "contentsChanged()" ) - EXIT - OTHERWISE - EXIT - ENDSWITCH - - lCont := .t. - - RETURN Nil - -/*----------------------------------------------------------------------*/ - METHOD IdeEditor:create( oIde, cSourceFile, nPos, nHPos, nVPos, cTheme ) DEFAULT oIde TO ::oIde @@ -911,15 +754,6 @@ METHOD IdeEditor:create( oIde, cSourceFile, nPos, nHPos, nVPos, cTheme ) ::buildTabPage( ::sourceFile ) - ::qEdit := ::buildEditor( 0 ) /* Main Editor */ - // - ::qCurEditSplit := ::qEdit - - ::qDocument := QTextDocument():configure( ::qEdit:document() ) - // - ::Connect( ::qDocument, "blockCountChanged(int)", {|o,p| ::exeBlock( 21, o, p ) } ) - ::Connect( ::qDocument, "contentsChanged()" , {|o | ::exeBlock( 22, o ) } ) - ::qLayout := QGridLayout():new() ::qLayout:setContentsMargins( 0,0,0,0 ) ::qLayout:setHorizontalSpacing( 5 ) @@ -927,50 +761,21 @@ METHOD IdeEditor:create( oIde, cSourceFile, nPos, nHPos, nVPos, cTheme ) // ::oTab:oWidget:setLayout( ::qLayout ) -#if 0 - ::qHLayout := QHBoxLayout():new() - ::qHLayout:setSpacing( 0 ) - // Row Col RSpn CSpn - ::qLayout:addLayout( ::qHLayout, 0, 0, 1, 1 ) - #if 1 - ::qLineNos := QLabel():new() - ::qLineNos:setAlignment( Qt_AlignRight + Qt_AlignTop ) - ::qLineNos:setFont( ::oFont:oWidget ) - ::qLineNos:setSizePolicy( QSizePolicy_Fixed, QSizePolicy_Expanding ) - ::qLineNos:setMinimumWidth( 50 ) - ::qLineNos:setMaximumWidth( 50 ) - #else - ::qLineNos := QTextEdit():new() - ::qLineNos:setTextBackgroundColor( QColor():new( Qt_lightGray ) ) - ::qLineNos:setAlignment( Qt_AlignRight ) - ::qLineNos:setVerticalScrollBarPolicy( Qt_ScrollBarAlwaysOff ) - ::qLineNos:setHorizontalScrollBarPolicy( Qt_ScrollBarAlwaysOff ) - ::qLineNos:setFrameStyle( QFrame_Raised ) - ::qLineNos:setReadOnly( .t. ) - ::qLineNos:setLineWrapMode( QTextEdit_NoWrap ) - ::qLineNos:setFont( ::oFont:oWidget ) - ::qLineNos:setContextMenuPolicy( Qt_NoContextMenu ) - ::qLineNos:setMinimumWidth( 70 ) - ::qLineNos:setMaximumWidth( 70 ) - #endif - ::qHLayout:addWidget( ::qLineNos ) - ::qHLayout:addWidget( ::qEdit ) -#else - ::qLayout:addWidget_1( ::qEdit, 0, 1, 1, 1 ) -#endif + ::oEdit := IdeEdit():new( Self, 0 ):create() + ::qEdit := ::oEdit:qEdit + ::qCurEditSplit := ::oEdit:qEdit + ::qDocument := QTextDocument():configure( ::qEdit:document() ) IF ::cType != "U" - ::qHiliter := ::oThemes:SetSyntaxHilighting( ::qEdit, @::cTheme ) + ::qHiliter := ::oThemes:SetSyntaxHilighting( ::oEdit:qEdit, @::cTheme ) ENDIF - - ::qEdit:show() ::qCursor := QTextCursor():configure( ::qEdit:textCursor() ) + ::qLayout:addLayout( ::oEdit:qHLayout, 0, 0 ) + /* Populate Tabs Array */ aadd( ::aTabs, { ::oTab, Self } ) - ::oIde:nCurTab := len( ::oIde:aTabs ) - /* Populate right at creation */ ::oEM:addSourceInTree( ::sourceFile ) @@ -981,26 +786,70 @@ METHOD IdeEditor:create( oIde, cSourceFile, nPos, nHPos, nVPos, cTheme ) /*----------------------------------------------------------------------*/ -METHOD IdeEditor:split( nMode, qEditP ) - LOCAL qEdit, nRows, nCols +METHOD IdeEditor:split( nOrient, oEditP ) + LOCAL oEdit, nRows, nCols - HB_SYMBOL_UNUSED( qEditP ) + HB_SYMBOL_UNUSED( oEditP ) + HB_SYMBOL_UNUSED( nOrient ) + + oEdit := IdeEdit():new( Self, 1 ):create() + oEdit:qEdit:setDocument( ::qDocument ) + + aadd( ::aEdits, oEdit ) nRows := ::qLayout:rowCount() - nCols := ::qlayout:columnCount() + nCols := ::qLayout:columnCount() - qEdit := ::buildEditor( 1 ) /* Split Window */ - IF nMode == 1 /* Horizontal */ - ::qLayout:addWidget( qEdit, nRows - 1, nCols ) - ELSEIF nMode == 2 /* Vertical */ - ::qLayout:addWidget( qEdit, nRows, nCols - 1 ) + IF nOrient == 1 + ::qLayout:addLayout( oEdit:qHLayout, nRows -1 , nCols ) + ELSEIF nOrient == 2 + ::qLayout:addLayout( oEdit:qHLayout, nRows, nCols - 1 ) ENDIF - aadd( ::aSplits, qEdit ) + RETURN Self - qEdit:setDocument( ::qEdit:document() ) +/*----------------------------------------------------------------------*/ - qEdit:show() +METHOD IdeEditor:destroy() + LOCAL n, oEdit + + ::qCurEditSplit := NIL + ::qEdit := NIL + DO WHILE len( ::aEdits ) > 0 + oEdit := ::aEdits[ 1 ] + hb_adel( ::aEdits, 1, .t. ) + oEdit:destroy() + ENDDO + ::oEdit:destroy() + + IF !Empty( ::qDocument ) + ::qDocument:pPtr := 0 + ::qDocument := nil + ENDIF + IF !Empty( ::qLayout ) + ::qLayout:pPtr := 0 + ::qLayout := nil + ENDIF + IF !Empty( ::qHiliter ) + ::qHiliter:pPtr := 0 + ::qHiliter := nil + ENDIF + + IF ( n := ascan( ::aTabs, {|e_| e_[ TAB_OEDITOR ] == Self } ) ) > 0 + hb_adel( ::oIde:aTabs, n, .T. ) + ENDIF + + ::oEM:removeSourceInTree( ::sourceFile ) + + ::qTabWidget:removeTab( ::qTabWidget:indexOf( ::oTab:oWidget ) ) + ::oTab := NIL + + IF ::qTabWidget:count() == 0 + IF ::lDockRVisible + ::oDockR:hide() + ::oIde:lDockRVisible := .f. + ENDIF + ENDIF RETURN Self @@ -1041,9 +890,9 @@ METHOD IdeEditor:activateTab( mp1, mp2, oXbp ) LOCAL oEdit HB_SYMBOL_UNUSED( mp1 ) + HB_SYMBOL_UNUSED( mp2 ) IF !empty( oEdit := ::oEM:getEditorByTabObject( oXbp ) ) - ::oIde:nCurTab := mp2 oEdit:setDocumentProperties() ENDIF @@ -1051,14 +900,6 @@ METHOD IdeEditor:activateTab( mp1, mp2, oXbp ) /*----------------------------------------------------------------------*/ -METHOD IdeEditor:destroy() - - ::RemoveTabPage() - - RETURN Self - -/*----------------------------------------------------------------------*/ - METHOD IdeEditor:buildTabPage( cSource ) ::oTab := XbpTabPage():new( ::oIde:oDA, , { 5,5 }, { 700,400 }, , .t. ) @@ -1079,71 +920,6 @@ METHOD IdeEditor:buildTabPage( cSource ) RETURN Self -/*----------------------------------------------------------------------*/ -/* - * Remove the tab of the main screen and clean the objects from memory.Note that - * this function does not question the User if he wants to save or not the - * content combined with this TAB if you want to confirm the action use - * HbIde:closeSource() instead. - * 02/01/2010 - 12:58:53 - vailtom - */ -METHOD IdeEditor:removeTabPage() - LOCAL cSource := ::sourceFile - LOCAL n, qEdit - - - FOR EACH qEdit IN ::aSplits - ::disConnectEditSlots( qEdit ) - ::qLayout:removeWidget( qEdit ) - qEdit:close() - qEdit:pPtr := 0 - qEdit := NIL - NEXT - ::aSplits := {} - ::qCurEditSplit := NIL - - ::disConnectEditSlots( ::qEdit ) - - IF !Empty( ::qDocument ) - ::disConnect( ::qDocument, "blockCountChanged(int)" ) - ::disConnect( ::qDocument, "contentsChanged()" ) - ::qDocument:pPtr := 0 - ::qDocument := nil - ENDIF - - IF !Empty( ::qLayout ) - ::qLayout:pPtr := 0 - ::qLayout := nil - ENDIF - - IF !Empty( ::qHiliter ) - ::qHiliter:pPtr := 0 - ::qHiliter := nil - ENDIF - - IF !Empty( ::qEdit ) - ::qEdit:pPtr := 0 - ::qEdit := nil - ::oIde:oFuncList:clear() - ENDIF - - IF ( n := ascan( ::aTabs, {|e_| e_[ TAB_OEDITOR ] == Self } ) ) > 0 - hb_adel( ::oIde:aTabs, n, .T. ) - ENDIF - - ::qTabWidget:removeTab( ::qTabWidget:indexOf( ::oTab:oWidget ) ) - - ::oEM:removeSourceInTree( cSource ) - - IF ::qTabWidget:count() == 0 - IF ::lDockRVisible - ::oDockR:hide() - ::oIde:lDockRVisible := .f. - ENDIF - ENDIF - - RETURN Self - /*----------------------------------------------------------------------*/ METHOD IdeEditor:dispEditInfo( qEdit ) @@ -1174,11 +950,11 @@ METHOD IdeEditor:dispEditInfo( qEdit ) METHOD IdeEditor:setTabImage( qEdit ) LOCAL nIndex, lModified, lReadOnly, cIcon - HB_SYMBOL_UNUSED( qEdit ) + DEFAULT qEdit TO ::oEdit:qEdit nIndex := ::qTabWidget:indexOf( ::oTab:oWidget ) lModified := ::qDocument:isModified() - lReadOnly := ::qEdit:isReadOnly() + lReadOnly := qEdit:isReadOnly() IF lModified cIcon := "tabmodified.png" @@ -1210,4 +986,211 @@ METHOD IdeEditor:applyTheme( cTheme ) RETURN Self /*----------------------------------------------------------------------*/ +// Class IdeEdit +// Holds One QPlainTextEdit with its ancilliary Components +/*----------------------------------------------------------------------*/ + +CLASS IdeEdit INHERIT IdeObject + + DATA oEditor + + DATA qEdit + DATA qHLayout + DATA qLineNos + + DATA nMode INIT 0 + DATA nLineNo INIT -99 + DATA nMaxDigits INIT 5 // Tobe + DATA nMaxRows INIT 100 + + DATA qPoint INIT QPoint():new( 0,0 ) + + METHOD new() + METHOD create() + METHOD destroy() + METHOD exeBlock() + METHOD connectEditSlots() + METHOD disConnectEditSlots() + + ENDCLASS + +/*----------------------------------------------------------------------*/ + +METHOD IdeEdit:new( oEditor, nMode ) + + ::oEditor := oEditor + ::nMode := nMode + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeEdit:create( oEditor, nMode ) + + DEFAULT oEditor TO ::oEditor + DEFAULT nMode TO ::nMode + + ::oEditor := oEditor + ::nMode := nMode + ::oIde := ::oEditor:oIde + + ::qEdit := QPlainTextEdit():new() + // + ::qEdit:setLineWrapMode( QTextEdit_NoWrap ) + ::qEdit:setFont( ::oFont:oWidget ) + ::qEdit:ensureCursorVisible() + ::qEdit:setContextMenuPolicy( Qt_CustomContextMenu ) + + ::qHLayout := QHBoxLayout():new() + ::qHLayout:setSpacing( 0 ) + + ::qLineNos := QTextEdit():new() + ::qLineNos:setTextBackgroundColor( QColor():new( 240,240,240 ) ) + ::qLineNos:setAcceptRichText( .t. ) + ::qLineNos:setAlignment( Qt_AlignRight ) + ::qLineNos:setVerticalScrollBarPolicy( Qt_ScrollBarAlwaysOff ) + ::qLineNos:setHorizontalScrollBarPolicy( Qt_ScrollBarAlwaysOff ) + ::qLineNos:setFrameStyle( QFrame_NoFrame ) + ::qLineNos:setReadOnly( .t. ) + ::qLineNos:setLineWrapMode( QTextEdit_NoWrap ) + ::qLineNos:setFont( ::oFont:oWidget ) + ::qLineNos:setContextMenuPolicy( Qt_NoContextMenu ) + ::qLineNos:setMinimumWidth( EDT_LINNO_WIDTH ) + ::qLineNos:setMaximumWidth( EDT_LINNO_WIDTH ) + ::qLineNos:setStyleSheet( "background-color: rgb( 240,240,240 );" ) + // + ::qHLayout:addWidget( ::qLineNos ) + ::qHLayout:addWidget( ::qEdit ) + + ::connectEditSlots( Self ) + + //::qLineNos:show() + //::qEdit:show() + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeEdit:destroy() + + ::disConnectEditSlots( Self ) + + ::qHLayout:removeWidget( ::qEdit ) + ::qHLayout:removeWidget( ::qLineNos ) + + ::qHLayout:pPtr := 0 + ::qHLayout := NIL + + ::qLineNos:pPtr := 0 + ::qLineNos := NIL + + ::qEdit:pPtr := 0 + ::qEdit := NIL + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeEdit:disConnectEditSlots( oEdit ) + + ::disConnect( oEdit:qEdit, "customContextMenuRequested(QPoint)" ) + ::disConnect( oEdit:qEdit, "textChanged()" ) + ::disConnect( oEdit:qEdit, "copyAvailable(bool)" ) + ::disConnect( oEdit:qEdit, "modificationChanged(bool)" ) + ::disConnect( oEdit:qEdit, "redoAvailable(bool)" ) + ::disConnect( oEdit:qEdit, "selectionChanged()" ) + * ::disConnect( oEdit:qEdit, "undoAvailable(bool)" ) + ::disConnect( oEdit:qEdit, "updateRequest(QRect,int)" ) + ::disConnect( oEdit:qEdit, "cursorPositionChanged()" ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeEdit:connectEditSlots( oEdit ) + + ::Connect( oEdit:qEdit, "updateRequest(QRect,int)" , {|o,p,p1| ::exeBlock( 8, oEdit, o, p, p1 ) } ) + ::connect( oEdit:qEdit, "customContextMenuRequested(QPoint)", {|o,p | ::exeBlock( 1, oEdit, o, p ) } ) + ::Connect( oEdit:qEdit, "textChanged()" , {|o | ::exeBlock( 2, oEdit, o ) } ) + ::Connect( oEdit:qEdit, "copyAvailable(bool)" , {|o,p | ::exeBlock( 3, oEdit, o, p ) } ) + ::Connect( oEdit:qEdit, "modificationChanged(bool)" , {|o,p | ::exeBlock( 4, oEdit, o, p ) } ) + ::Connect( oEdit:qEdit, "redoAvailable(bool)" , {|o,p | ::exeBlock( 5, oEdit, o, p ) } ) + ::Connect( oEdit:qEdit, "selectionChanged()" , {|o,p | ::exeBlock( 6, oEdit, o, p ) } ) + * ::Connect( oEdit:qEdit, "undoAvailable(bool)" , {|o,p | ::exeBlock( 7, oEdit, o, p ) } ) + ::Connect( oEdit:qEdit, "cursorPositionChanged()" , {|o | ::exeBlock( 9, oEdit, o ) } ) + + RETURN Self + +/*----------------------------------------------------------------------*/ + +METHOD IdeEdit:exeBlock( nMode, oEdit, o, p, p1 ) + LOCAL pAct, qAct, n, pCursor, qCursor, qEdit, nLineNo, oo + + HB_SYMBOL_UNUSED( o ) + HB_SYMBOL_UNUSED( p1 ) + + qEdit := oEdit:qEdit + + SWITCH nMode + + /* QPlainTextEdit */ + CASE customContextMenuRequested + IF !empty( pAct := ::oEM:qContextMenu:exec_1( qEdit:mapToGlobal( p ) ) ) + qAct := QAction():configure( pAct ) + DO CASE + CASE qAct:text() == "Split Horizontally" + ::oEditor:split( 1, oEdit ) + CASE qAct:text() == "Split Vertically" + ::oEditor:split( 2, oEdit ) + CASE qAct:text() == "Close Split Window" + IF ( n := ascan( ::oEditor:aEdits, {|o| o == oEdit } ) ) > 0 /* 1 == Main Edit */ + oo := ::oEditor:aEdits[ n ] + hb_adel( ::oEditor:aEdits, n, .t. ) + oo:destroy() + ENDIF + CASE qAct:text() == "Apply Theme" + ::oEditor:applyTheme() + ENDCASE + ENDIF + EXIT + CASE textChanged + ::oEditor:setTabImage( qEdit ) + EXIT + CASE copyAvailable + hbide_dbg( "copyAvailable(bool)" ) + EXIT + CASE modificationChanged + hbide_dbg( "modificationChanged(bool)" ) + EXIT + CASE redoAvailable + hbide_dbg( "redoAvailable(bool)" ) + EXIT + CASE selectionChanged + ::oEditor:qCurEditSplit := qEdit + hbide_dbg( "selectionChanged()" ) + EXIT + CASE undoAvailable + hbide_dbg( "undoAvailable(bool)" ) + EXIT + CASE updateRequest + pCursor := qEdit:cursorForPosition( ::qPoint ) + IF hb_isPointer( pCursor ) + qCursor := QTextCursor():configure( pCursor ) + nLineNo := qCursor:blockNumber() + IF oEdit:nLineNo != nLineNo + oEdit:nLineNo := nLineNo + oEdit:qLineNos:setHTML( hbide_buildLinesLabel( ::nLineNo + 1, ::oEditor:qDocument:blockCount(), ::nMaxDigits, ::nMaxRows ) ) + ENDIF + ENDIF + EXIT + + CASE cursorPositionChanged + ::oEditor:dispEditInfo( qEdit ) + EXIT + + ENDSWITCH + + RETURN Nil + +/*----------------------------------------------------------------------*/ diff --git a/harbour/contrib/hbide/idemisc.prg b/harbour/contrib/hbide/idemisc.prg index b5dbef762e..e77d09878a 100644 --- a/harbour/contrib/hbide/idemisc.prg +++ b/harbour/contrib/hbide/idemisc.prg @@ -1032,11 +1032,18 @@ FUNCTION hbide_expandProjects( oIde ) /*----------------------------------------------------------------------*/ -FUNCTION hbide_buildLinesLabel( nFrom, nTimes, nW ) - LOCAL i, s := "" +FUNCTION hbide_buildLinesLabel( nFrom, nTo, nW, nMax ) + LOCAL n, i, s := "" - FOR i := 1 TO nTimes - s += padl( hb_ntos( nFrom++ ), nW ) + CRLF + n := min( nMax, nTo - nFrom ) + + FOR i := 0 TO n + IF ( ( nFrom + i ) % 10 ) == 0 + s += "" + padl( hb_ntos( nFrom + i ), nW ) + "
" + ELSE + //s += padl( hb_ntos( nFrom + i ), nW ) + CRLF + s += padl( hb_ntos( nFrom + i ), nW ) + "
" + ENDIF NEXT RETURN s diff --git a/harbour/contrib/hbide/ideobject.prg b/harbour/contrib/hbide/ideobject.prg index 81d3042873..15aed42138 100644 --- a/harbour/contrib/hbide/ideobject.prg +++ b/harbour/contrib/hbide/ideobject.prg @@ -76,6 +76,8 @@ CLASS IdeObject ACCESS pEvents INLINE hbxbp_getEventsPtr() DATA xD + DATA xD1 + DATA xD2 DATA oIde DATA oUI diff --git a/harbour/contrib/hbide/idesources.prg b/harbour/contrib/hbide/idesources.prg index 16cf768bce..cf6e171122 100644 --- a/harbour/contrib/hbide/idesources.prg +++ b/harbour/contrib/hbide/idesources.prg @@ -246,28 +246,28 @@ METHOD IdeSourcesManager:editSource( cSourceFile, nPos, nHPos, nVPos, cTheme, lA /*----------------------------------------------------------------------*/ METHOD IdeSourcesManager:closeSource( nTab, lCanCancel, lCanceled ) - LOCAL lSave, n, oEdit + LOCAL lSave, n, oEditor DEFAULT nTab TO ::oEM:getTabCurrent() - IF !empty( oEdit := ::oEM:getEditorByTabPosition( nTab ) ) + IF !empty( oEditor := ::oEM:getEditorByTabPosition( nTab ) ) DEFAULT lCanCancel TO .F. lCanceled := .F. - IF !( oEdit:qDocument:isModified() ) + IF !( oEditor:qDocument:isModified() ) * File has not changed, ignore the question to User lSave := .F. ELSEIF lCanCancel - n := hbide_getYesNoCancel( oEdit:oTab:Caption, "Has been modified, save this source?", 'Save?' ) + n := hbide_getYesNoCancel( oEditor:oTab:Caption, "Has been modified, save this source?", 'Save?' ) IF ( lCanceled := ( n == QMessageBox_Cancel ) ) RETURN .F. ENDIF lSave := ( n == QMessageBox_Yes ) ELSE - lSave := hbide_getYesNo( oEdit:oTab:Caption, "Has been modified, save this source?", 'Save?' ) + lSave := hbide_getYesNo( oEditor:oTab:Caption, "Has been modified, save this source?", 'Save?' ) ENDIF @@ -277,7 +277,7 @@ METHOD IdeSourcesManager:closeSource( nTab, lCanCancel, lCanceled ) ENDIF ENDIF - oEdit:removeTabPage() + oEditor:destroy() ::oIde:updateTitleBar() ENDIF