GSOC work, code fixes

Small fix in the listbox size: I'm using GetOptimalSize to set the correct width.
EditorWindow::KeyInput: autocomplete/codecomplete functions have been placed into separate functions.
Function autoclose sub/functions: duplicate code removal.

Change-Id: I44678753fc9737fd7a0913af3caa4f1f565aca28
This commit is contained in:
Gergo Mocsi
2013-08-07 09:32:36 +02:00
parent 6b47b09f66
commit 6a2aa97cc1
2 changed files with 280 additions and 259 deletions

View File

@@ -122,6 +122,11 @@ private:
OUString GetActualSubName( sal_uLong nLine ); // gets the actual subroutine name according to line number OUString GetActualSubName( sal_uLong nLine ); // gets the actual subroutine name according to line number
std::vector< OUString > GetXIdlClassMethods( ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass > xClass ) const; std::vector< OUString > GetXIdlClassMethods( ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass > xClass ) const;
std::vector< OUString > GetXIdlClassFields( ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass > xClass ) const; std::vector< OUString > GetXIdlClassFields( ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass > xClass ) const;
void HandleAutoCorrect();
void HandleAutoCloseParen();
void HandleAutoCloseDoubleQuotes();
void HandleCodeCompletition();
void HandleProcedureCompletition();
protected: protected:
virtual void Paint( const Rectangle& ); virtual void Paint( const Rectangle& );

View File

@@ -522,279 +522,28 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
rKEvt.GetKeyCode().GetCode() == KEY_TAB || rKEvt.GetKeyCode().GetCode() == KEY_TAB ||
rKEvt.GetKeyCode().GetCode() == KEY_RETURN ) && CodeCompleteOptions::IsAutoCorrectKeywordsOn() ) rKEvt.GetKeyCode().GetCode() == KEY_RETURN ) && CodeCompleteOptions::IsAutoCorrectKeywordsOn() )
{ {
TextSelection aSel = GetEditView()->GetSelection(); HandleAutoCorrect();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified
HighlightPortions aPortions;
aHighlighter.getHighlightPortions( nLine, aLine, aPortions );
if( aPortions.size() > 0 )
{
HighlightPortion& r = aPortions[aPortions.size()-1];
if( r.tokenType == 9 ) // correct the last entered keyword
{
OUString sStr = aLine.copy(r.nBegin, r.nEnd - r.nBegin);
if( !sStr.isEmpty() )
{
//capitalize first letter and replace
sStr = sStr.toAsciiLowerCase();
sStr = sStr.replaceAt( 0, 1, OUString(sStr[0]).toAsciiUpperCase() );
TextPaM aStart(nLine, aSel.GetStart().GetIndex() - sStr.getLength() );
TextSelection sTextSelection(aStart, TextPaM(nLine, aSel.GetStart().GetIndex()));
pEditEngine->ReplaceText( sTextSelection, sStr );
pEditView->SetSelection( aSel );
}
}
}
} }
if( rKEvt.GetCharCode() == '"' && CodeCompleteOptions::IsAutoCloseQuotesOn() ) if( rKEvt.GetCharCode() == '"' && CodeCompleteOptions::IsAutoCloseQuotesOn() )
{//autoclose double quotes {//autoclose double quotes
TextSelection aSel = GetEditView()->GetSelection(); HandleAutoCloseDoubleQuotes();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified
HighlightPortions aPortions;
aHighlighter.getHighlightPortions( nLine, aLine, aPortions );
if( aPortions.size() != 0 )
{
if( aLine.getLength() > 0 && aLine[aLine.getLength()-1] != '"' && (aPortions[aPortions.size()-1].tokenType != 4) )
{
GetEditView()->InsertText(OUString("\""));
//leave the cursor on it's place: inside the two double quotes
TextPaM aEnd(nLine, aSel.GetEnd().GetIndex());
GetEditView()->SetSelection( TextSelection( aEnd, aEnd ) );
}
}
} }
if( rKEvt.GetCharCode() == '(' && CodeCompleteOptions::IsAutoCloseParenthesisOn() ) if( rKEvt.GetCharCode() == '(' && CodeCompleteOptions::IsAutoCloseParenthesisOn() )
{//autoclose parenthesis {//autoclose parenthesis
TextSelection aSel = GetEditView()->GetSelection(); HandleAutoCloseParen();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified
if( aLine.getLength() > 0 && aLine[aSel.GetEnd().GetIndex()-1] != '(' )
{
GetEditView()->InsertText(OUString(")"));
//leave the cursor on it's place: inside the parenthesis
TextPaM aEnd(nLine, aSel.GetEnd().GetIndex());
GetEditView()->SetSelection( TextSelection( aEnd, aEnd ) );
}
} }
if( rKEvt.GetKeyCode().GetCode() == KEY_RETURN && CodeCompleteOptions::IsProcedureAutoCompleteOn() ) if( rKEvt.GetKeyCode().GetCode() == KEY_RETURN && CodeCompleteOptions::IsProcedureAutoCompleteOn() )
{//autoclose implementation {//autoclose implementation
TextSelection aSel = GetEditView()->GetSelection(); HandleProcedureCompletition();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) );
OUString sActSub = GetActualSubName( nLine );
HighlightPortions aPortions;
aHighlighter.getHighlightPortions( nLine, aLine, aPortions );
OUString sProcType;
OUString sProcName;
bool bFoundType = false;
bool bFoundName = false;
if( aPortions.size() != 0 )
{
for ( size_t i = 0; i < aPortions.size(); i++ )
{
HighlightPortion& r = aPortions[i];
OUString sTokStr = aLine.copy(r.nBegin, r.nEnd - r.nBegin);
if( r.tokenType == 9 && ( sTokStr.equalsIgnoreAsciiCase("sub")
|| sTokStr.equalsIgnoreAsciiCase("function")) )
{
sProcType = sTokStr;
bFoundType = true;
}
if( r.tokenType == 1 && bFoundType )
{
sProcName = sTokStr;
bFoundName = true;
break;
}
}
if( bFoundType && bFoundName )
{// found, search for end
if( nLine+1 == pEditEngine->GetParagraphCount() )
{ //append to the end
OUString sText("\nEnd ");
if( sProcType.equalsIgnoreAsciiCase("function") )
sText += OUString( "Function\n" );
if( sProcType.equalsIgnoreAsciiCase("sub") )
sText += OUString( "Sub\n" );
pEditView->InsertText( sText );
}
else
{
for( sal_uLong i = nLine+1; i < pEditEngine->GetParagraphCount(); ++i )
{
OUString aCurrLine = pEditEngine->GetText( i );
HighlightPortions aCurrPortions;
aHighlighter.getHighlightPortions( i, aCurrLine, aCurrPortions );
if( aCurrPortions.size() >= 3 )
{
HighlightPortion& r1 = aCurrPortions[0];
OUString sStr1 = aCurrLine.copy(r1.nBegin, r1.nEnd - r1.nBegin);
if( r1.tokenType == 9 )
{
if( sStr1.equalsIgnoreAsciiCase("sub") )
{
OUString sText("\nEnd ");
if( sProcType.equalsIgnoreAsciiCase("function") )
sText += OUString( "Function\n" );
if( sProcType.equalsIgnoreAsciiCase("sub") )
sText += OUString( "Sub\n" );
pEditView->InsertText( sText );
break;
}
if( sStr1.equalsIgnoreAsciiCase("function") )
{
OUString sText("\nEnd ");
if( sProcType.equalsIgnoreAsciiCase("function") )
sText += OUString( "Function\n" );
if( sProcType.equalsIgnoreAsciiCase("sub") )
sText += OUString( "Sub\n" );
pEditView->InsertText( sText );
break;
}
if( sStr1.equalsIgnoreAsciiCase("end") )
{
break;
}
}
}
}
}
}
}
} }
if( rKEvt.GetKeyCode().GetCode() == KEY_POINT && if( rKEvt.GetKeyCode().GetCode() == KEY_POINT &&
(CodeCompleteOptions::IsCodeCompleteOn() || CodeCompleteOptions::IsExtendedTypeDeclaration()) ) (CodeCompleteOptions::IsCodeCompleteOn() || CodeCompleteOptions::IsExtendedTypeDeclaration()) )
{ {
rModulWindow.UpdateModule(); HandleCodeCompletition();
rModulWindow.GetSbModule()->GetCodeCompleteDataFromParse(aCodeCompleteCache);
TextSelection aSel = GetEditView()->GetSelection();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified
std::vector< OUString > aVect;
HighlightPortions aPortions;
aHighlighter.getHighlightPortions( nLine, aLine, aPortions );
if( aPortions.size() != 0 )
{
for ( size_t i = 0; i < aPortions.size(); i++ )
{
HighlightPortion& r = aPortions[i];
if( r.tokenType == 1 || r.tokenType == 9) // extract the identifers(methods, base variable)
/* an example: Dim aLocVar2 as com.sun.star.beans.PropertyValue
* here, aLocVar2.Name, and PropertyValue's Name field is treated as a keyword(?!)
* */
aVect.push_back( aLine.copy(r.nBegin, r.nEnd - r.nBegin) );
}
OUString sBaseName = aVect[0];//variable name
OUString sVarType = aCodeCompleteCache.GetVarType( sBaseName );
if( !sVarType.isEmpty() && CodeCompleteOptions::IsAutoCorrectKeywordsOn() )//correct variable name
{
TextPaM aStart(nLine, aSel.GetStart().GetIndex() - sBaseName.getLength() );
TextSelection sTextSelection(aStart, TextPaM(nLine, aSel.GetStart().GetIndex()));
pEditEngine->ReplaceText( sTextSelection, aCodeCompleteCache.GetCorrectCaseVarName(sBaseName) );
pEditView->SetSelection( aSel );
}
Reference< lang::XMultiServiceFactory > xFactory( comphelper::getProcessServiceFactory(), UNO_SET_THROW );
Reference< reflection::XIdlReflection > xRefl( xFactory->createInstance("com.sun.star.reflection.CoreReflection"), UNO_QUERY_THROW );
if( xRefl.is() )
{
Reference< reflection::XIdlClass > xClass = xRefl->forName(sVarType);//get the base class for reflection
if( xClass != NULL )
{
unsigned int j = 1;
OUString sMethName;
bool bReflect = true;
while( j != aVect.size() )
{
sMethName = aVect[j];
Reference< reflection::XIdlField> xField = xClass->getField( sMethName );
if( xField != NULL )
{
xClass = xField->getType();
if( xClass == NULL )
{
break;
}
}
else
{
if( CodeCompleteOptions::IsExtendedTypeDeclaration() )
{
Reference< reflection::XIdlMethod> xMethod = xClass->getMethod( sMethName );
if( xMethod != NULL ) //method OK
{
xClass = xMethod->getReturnType();
if( xClass == NULL )
{
break;
}
}
else
{//nothing to reflect
bReflect = false;
break;
}
}
else
{// no extended types allowed
bReflect = false;
break;
}
}
j++;
}
if( bReflect )
{
std::vector< OUString > aEntryVect;//entries to be inserted into the list
std::vector< OUString > aMethVect = GetXIdlClassMethods(xClass);//methods
std::vector< OUString > aFieldVect = GetXIdlClassFields(xClass);//fields
aEntryVect.insert(aEntryVect.end(), aFieldVect.begin(), aFieldVect.end() );
if( CodeCompleteOptions::IsExtendedTypeDeclaration() )
{// if extended types on, reflect classes, else just the structs (XIdlClass without methods)
aEntryVect.insert(aEntryVect.end(), aMethVect.begin(), aMethVect.end() );
}
if( aEntryVect.size() > 0 )
{
// calculate position
Rectangle aRect = ( (TextEngine*) GetEditEngine() )->PaMtoEditCursor( aSel.GetEnd() , false );
long nViewYOffset = pEditView->GetStartDocPos().Y();
Point aPoint = aRect.BottomRight();
aPoint.Y() = aPoint.Y() - nViewYOffset;
aPoint.Y() += 2;
aSel.GetStart().GetIndex() += 1;
aSel.GetEnd().GetIndex() += 1;
pCodeCompleteWnd->ClearListBox();
pCodeCompleteWnd->SetTextSelection(aSel);
//fill the listbox
for(unsigned int l = 0; l < aEntryVect.size(); ++l)
{
pCodeCompleteWnd->InsertEntry( aEntryVect[l] );
}
//show it
pCodeCompleteWnd->SetPosPixel( aPoint );
pCodeCompleteWnd->Show();
pCodeCompleteWnd->ResizeListBox();
pCodeCompleteWnd->SelectFirstEntry();
pEditView->GetWindow()->GrabFocus();
}
}
}
}
}
} }
if ( !bDone && ( !TextEngine::DoesKeyChangeText( rKEvt ) || ImpCanModify() ) ) if ( !bDone && ( !TextEngine::DoesKeyChangeText( rKEvt ) || ImpCanModify() ) )
{ {
@@ -839,6 +588,273 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
} }
} }
void EditorWindow::HandleAutoCorrect()
{
TextSelection aSel = GetEditView()->GetSelection();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified
HighlightPortions aPortions;
aHighlighter.getHighlightPortions( nLine, aLine, aPortions );
if( aPortions.size() > 0 )
{
HighlightPortion& r = aPortions[aPortions.size()-1];
if( r.tokenType == 9 ) // correct the last entered keyword
{
OUString sStr = aLine.copy(r.nBegin, r.nEnd - r.nBegin);
if( !sStr.isEmpty() )
{
//capitalize first letter and replace
sStr = sStr.toAsciiLowerCase();
sStr = sStr.replaceAt( 0, 1, OUString(sStr[0]).toAsciiUpperCase() );
TextPaM aStart(nLine, aSel.GetStart().GetIndex() - sStr.getLength() );
TextSelection sTextSelection(aStart, TextPaM(nLine, aSel.GetStart().GetIndex()));
pEditEngine->ReplaceText( sTextSelection, sStr );
pEditView->SetSelection( aSel );
}
}
}
}
void EditorWindow::HandleAutoCloseParen()
{
TextSelection aSel = GetEditView()->GetSelection();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified
if( aLine.getLength() > 0 && aLine[aSel.GetEnd().GetIndex()-1] != '(' )
{
GetEditView()->InsertText(OUString(")"));
//leave the cursor on it's place: inside the parenthesis
TextPaM aEnd(nLine, aSel.GetEnd().GetIndex());
GetEditView()->SetSelection( TextSelection( aEnd, aEnd ) );
}
}
void EditorWindow::HandleAutoCloseDoubleQuotes()
{
TextSelection aSel = GetEditView()->GetSelection();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified
HighlightPortions aPortions;
aHighlighter.getHighlightPortions( nLine, aLine, aPortions );
if( aPortions.size() != 0 )
{
if( aLine.getLength() > 0 && aLine[aLine.getLength()-1] != '"' && (aPortions[aPortions.size()-1].tokenType != 4) )
{
GetEditView()->InsertText(OUString("\""));
//leave the cursor on it's place: inside the two double quotes
TextPaM aEnd(nLine, aSel.GetEnd().GetIndex());
GetEditView()->SetSelection( TextSelection( aEnd, aEnd ) );
}
}
}
void EditorWindow::HandleProcedureCompletition()
{
TextSelection aSel = GetEditView()->GetSelection();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) );
OUString sActSub = GetActualSubName( nLine );
HighlightPortions aPortions;
aHighlighter.getHighlightPortions( nLine, aLine, aPortions );
OUString sProcType;
OUString sProcName;
bool bFoundType = false;
bool bFoundName = false;
if( aPortions.size() != 0 )
{
for ( size_t i = 0; i < aPortions.size(); i++ )
{
HighlightPortion& r = aPortions[i];
OUString sTokStr = aLine.copy(r.nBegin, r.nEnd - r.nBegin);
if( r.tokenType == 9 && ( sTokStr.equalsIgnoreAsciiCase("sub")
|| sTokStr.equalsIgnoreAsciiCase("function")) )
{
sProcType = sTokStr;
bFoundType = true;
}
if( r.tokenType == 1 && bFoundType )
{
sProcName = sTokStr;
bFoundName = true;
break;
}
}
if( bFoundType && bFoundName )
{// found, search for end
OUString sText("\nEnd ");
if( sProcType.equalsIgnoreAsciiCase("function") )
sText += OUString( "Function\n" );
if( sProcType.equalsIgnoreAsciiCase("sub") )
sText += OUString( "Sub\n" );
if( nLine+1 == pEditEngine->GetParagraphCount() )
{ //append to the end
pEditView->InsertText( sText );
}
else
{
for( sal_uLong i = nLine+1; i < pEditEngine->GetParagraphCount(); ++i )
{
OUString aCurrLine = pEditEngine->GetText( i );
HighlightPortions aCurrPortions;
aHighlighter.getHighlightPortions( i, aCurrLine, aCurrPortions );
if( aCurrPortions.size() >= 3 )
{
HighlightPortion& r1 = aCurrPortions[0];
OUString sStr1 = aCurrLine.copy(r1.nBegin, r1.nEnd - r1.nBegin);
if( r1.tokenType == 9 )
{
if( sStr1.equalsIgnoreAsciiCase("sub") )
{
pEditView->InsertText( sText );
break;
}
if( sStr1.equalsIgnoreAsciiCase("function") )
{
pEditView->InsertText( sText );
break;
}
if( sStr1.equalsIgnoreAsciiCase("end") )
{
break;
}
}
}
}
}
}
}
}
void EditorWindow::HandleCodeCompletition()
{
rModulWindow.UpdateModule();
rModulWindow.GetSbModule()->GetCodeCompleteDataFromParse(aCodeCompleteCache);
TextSelection aSel = GetEditView()->GetSelection();
sal_uLong nLine = aSel.GetStart().GetPara();
OUString aLine( pEditEngine->GetText( nLine ) ); // the line being modified
std::vector< OUString > aVect;
HighlightPortions aPortions;
aHighlighter.getHighlightPortions( nLine, aLine, aPortions );
if( aPortions.size() != 0 )
{
for ( size_t i = 0; i < aPortions.size(); i++ )
{
HighlightPortion& r = aPortions[i];
if( r.tokenType == 1 || r.tokenType == 9) // extract the identifers(methods, base variable)
/* an example: Dim aLocVar2 as com.sun.star.beans.PropertyValue
* here, aLocVar2.Name, and PropertyValue's Name field is treated as a keyword(?!)
* */
aVect.push_back( aLine.copy(r.nBegin, r.nEnd - r.nBegin) );
}
OUString sBaseName = aVect[0];//variable name
OUString sVarType = aCodeCompleteCache.GetVarType( sBaseName );
if( !sVarType.isEmpty() && CodeCompleteOptions::IsAutoCorrectKeywordsOn() )//correct variable name
{
TextPaM aStart(nLine, aSel.GetStart().GetIndex() - sBaseName.getLength() );
TextSelection sTextSelection(aStart, TextPaM(nLine, aSel.GetStart().GetIndex()));
pEditEngine->ReplaceText( sTextSelection, aCodeCompleteCache.GetCorrectCaseVarName(sBaseName) );
pEditView->SetSelection( aSel );
}
Reference< lang::XMultiServiceFactory > xFactory( comphelper::getProcessServiceFactory(), UNO_SET_THROW );
Reference< reflection::XIdlReflection > xRefl( xFactory->createInstance("com.sun.star.reflection.CoreReflection"), UNO_QUERY_THROW );
if( xRefl.is() )
{
Reference< reflection::XIdlClass > xClass = xRefl->forName(sVarType);//get the base class for reflection
if( xClass != NULL )
{
unsigned int j = 1;
OUString sMethName;
bool bReflect = true;
while( j != aVect.size() )
{
sMethName = aVect[j];
Reference< reflection::XIdlField> xField = xClass->getField( sMethName );
if( xField != NULL )
{
xClass = xField->getType();
if( xClass == NULL )
{
break;
}
}
else
{
if( CodeCompleteOptions::IsExtendedTypeDeclaration() )
{
Reference< reflection::XIdlMethod> xMethod = xClass->getMethod( sMethName );
if( xMethod != NULL ) //method OK
{
xClass = xMethod->getReturnType();
if( xClass == NULL )
{
break;
}
}
else
{//nothing to reflect
bReflect = false;
break;
}
}
else
{// no extended types allowed
bReflect = false;
break;
}
}
j++;
}
if( bReflect )
{
std::vector< OUString > aEntryVect;//entries to be inserted into the list
std::vector< OUString > aMethVect = GetXIdlClassMethods(xClass);//methods
std::vector< OUString > aFieldVect = GetXIdlClassFields(xClass);//fields
aEntryVect.insert(aEntryVect.end(), aFieldVect.begin(), aFieldVect.end() );
if( CodeCompleteOptions::IsExtendedTypeDeclaration() )
{// if extended types on, reflect classes, else just the structs (XIdlClass without methods)
aEntryVect.insert(aEntryVect.end(), aMethVect.begin(), aMethVect.end() );
}
if( aEntryVect.size() > 0 )
{
// calculate position
Rectangle aRect = ( (TextEngine*) GetEditEngine() )->PaMtoEditCursor( aSel.GetEnd() , false );
long nViewYOffset = pEditView->GetStartDocPos().Y();
Point aPoint = aRect.BottomRight();
aPoint.Y() = aPoint.Y() - nViewYOffset;
aPoint.Y() += 2;
aSel.GetStart().GetIndex() += 1;
aSel.GetEnd().GetIndex() += 1;
pCodeCompleteWnd->ClearListBox();
pCodeCompleteWnd->SetTextSelection(aSel);
//fill the listbox
for(unsigned int l = 0; l < aEntryVect.size(); ++l)
{
pCodeCompleteWnd->InsertEntry( aEntryVect[l] );
}
//show it
pCodeCompleteWnd->SetPosPixel( aPoint );
pCodeCompleteWnd->Show();
pCodeCompleteWnd->ResizeListBox();
pCodeCompleteWnd->SelectFirstEntry();
pEditView->GetWindow()->GrabFocus();
}
}
}
}
}
}
std::vector< OUString > EditorWindow::GetXIdlClassMethods( Reference< reflection::XIdlClass > xClass ) const std::vector< OUString > EditorWindow::GetXIdlClassMethods( Reference< reflection::XIdlClass > xClass ) const
{ {
Sequence< Reference< reflection::XIdlMethod > > aMethods = xClass->getMethods(); Sequence< Reference< reflection::XIdlMethod > > aMethods = xClass->getMethods();
@@ -2659,7 +2675,6 @@ void CodeCompleteListBox::SetVisibleEntries()
void CodeCompleteListBox::KeyInput( const KeyEvent& rKeyEvt ) void CodeCompleteListBox::KeyInput( const KeyEvent& rKeyEvt )
{ {
//std::cerr << "CodeCompleteListBox::KeyInput" << std::endl;
sal_Unicode aChar = rKeyEvt.GetKeyCode().GetCode(); sal_Unicode aChar = rKeyEvt.GetKeyCode().GetCode();
if( ( aChar >= KEY_A ) && ( aChar <= KEY_Z ) ) if( ( aChar >= KEY_A ) && ( aChar <= KEY_Z ) )
{ {
@@ -2768,8 +2783,9 @@ void CodeCompleteWindow::ResizeListBox()
const Font& aFont = pListBox->GetUnzoomedControlPointFont(); const Font& aFont = pListBox->GetUnzoomedControlPointFont();
Rectangle aVisArea( pParent->GetEditView()->GetStartDocPos(), pParent->GetOutputSizePixel() ); Rectangle aVisArea( pParent->GetEditView()->GetStartDocPos(), pParent->GetOutputSizePixel() );
Size aSize = pListBox->CalcSize( nColumns+1, nLines ); Size aSize = pListBox->GetOptimalSize();//this sets the correct width
aSize.setWidth(nWidth+5); aSize.setHeight( pListBox->CalcSize( nColumns, nLines ).getHeight() );
Point aBottomPoint = aVisArea.BottomRight(); Point aBottomPoint = aVisArea.BottomRight();
Point aTopPoint = aVisArea.TopRight(); Point aTopPoint = aVisArea.TopRight();
long nYDiff = std::abs((aBottomPoint.Y() - aTopPoint.Y()) - GetPosPixel().Y()); long nYDiff = std::abs((aBottomPoint.Y() - aTopPoint.Y()) - GetPosPixel().Y());