summaryrefslogtreecommitdiff
path: root/basctl
diff options
context:
space:
mode:
authorGergo Mocsi <gmocsi91@gmail.com>2013-08-06 11:30:21 +0200
committerGergo Mocsi <gmocsi91@gmail.com>2013-09-02 18:16:55 +0200
commitb4319d8726e3d01b55f80b1dc30af1f96df1c211 (patch)
tree6b4c80d25cdced16ac009699ea415bad7a57c68b /basctl
parent972bbede6e79fb7c828a32a560559391290af997 (diff)
GSOC work, Extended types correction
Stucts can be autocompleted when extended types disabled. Created two functions to make the code brighter. They extract the methods/fields from an XIdlClass and return them in a std::vector<OUString>. I had to modify file basic/source/comp/dim.cxx, to check on UNO types when code completition is on. Change-Id: Id93a6fe896424efb7868f6102985f59fb419b17e
Diffstat (limited to 'basctl')
-rw-r--r--basctl/source/basicide/baside2.hxx3
-rw-r--r--basctl/source/basicide/baside2b.cxx106
2 files changed, 76 insertions, 33 deletions
diff --git a/basctl/source/basicide/baside2.hxx b/basctl/source/basicide/baside2.hxx
index 68f16a12216e..78932cfe2e92 100644
--- a/basctl/source/basicide/baside2.hxx
+++ b/basctl/source/basicide/baside2.hxx
@@ -53,6 +53,7 @@ class SvxSearchItem;
#include <vcl/textdata.hxx>
#include <basic/codecompletecache.hxx>
+#include "com/sun/star/reflection/XIdlClass.hpp"
namespace com { namespace sun { namespace star { namespace beans {
class XMultiPropertySet;
@@ -119,6 +120,8 @@ private:
CodeCompleteDataCache aCodeCompleteCache;
boost::scoped_ptr< CodeCompleteWindow > pCodeCompleteWnd;
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 > GetXIdlClassFields( ::com::sun::star::uno::Reference< ::com::sun::star::reflection::XIdlClass > xClass ) const;
protected:
virtual void Paint( const Rectangle& );
diff --git a/basctl/source/basicide/baside2b.cxx b/basctl/source/basicide/baside2b.cxx
index fd69045302f0..adcfd0be8d26 100644
--- a/basctl/source/basicide/baside2b.cxx
+++ b/basctl/source/basicide/baside2b.cxx
@@ -510,10 +510,11 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
if( pCodeCompleteWnd->IsVisible() && CodeCompleteOptions::IsCodeCompleteOn() )
{
- std::cerr << "EditorWindow::KeyInput" << std::endl;
+ //std::cerr << "EditorWindow::KeyInput" << std::endl;
pCodeCompleteWnd->GetListBox()->KeyInput(rKEvt);
if( rKEvt.GetKeyCode().GetCode() == KEY_UP
- || rKEvt.GetKeyCode().GetCode() == KEY_DOWN )
+ || rKEvt.GetKeyCode().GetCode() == KEY_DOWN
+ || rKEvt.GetKeyCode().GetCode() == KEY_TAB )
return;
}
@@ -672,7 +673,8 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
}
}
- if( rKEvt.GetKeyCode().GetCode() == KEY_POINT && CodeCompleteOptions::IsCodeCompleteOn() )
+ if( rKEvt.GetKeyCode().GetCode() == KEY_POINT &&
+ (CodeCompleteOptions::IsCodeCompleteOn() || CodeCompleteOptions::IsExtendedTypeDeclaration()) )
{
rModulWindow.UpdateModule();
rModulWindow.GetSbModule()->GetCodeCompleteDataFromParse(aCodeCompleteCache);
@@ -688,7 +690,10 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
for ( size_t i = 0; i < aPortions.size(); i++ )
{
HighlightPortion& r = aPortions[i];
- if( r.tokenType == 1 ) // extract the identifers(methods, base variable)
+ 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) );
}
@@ -716,39 +721,51 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
while( j != aVect.size() )
{
sMethName = aVect[j];
- Reference< reflection::XIdlMethod> xMethod = xClass->getMethod( sMethName );
- if( xMethod != NULL ) //method OK
+ Reference< reflection::XIdlField> xField = xClass->getField( sMethName );
+ if( xField != NULL )
{
- xClass = xMethod->getReturnType();
+ xClass = xField->getType();
if( xClass == NULL )
+ {
break;
+ }
}
else
{
- bReflect = false;
- break;
+ 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 )
{
- Sequence< Reference< reflection::XIdlMethod > > aMethods = xClass->getMethods();
- Sequence< Reference< reflection::XIdlField > > aFields = xClass->getFields();
- std::vector< OUString > aEntryVect;
-
- if( aMethods.getLength() != 0 )
- {
- for(sal_Int32 l = 0; l < aMethods.getLength(); ++l)
- {
- aEntryVect.push_back(OUString(aMethods[l]->getName()));
- }
- }
- if( aFields.getLength() != 0 )
- {
- for(sal_Int32 l = 0; l < aFields.getLength(); ++l)
- {
- aEntryVect.push_back(OUString(aFields[l]->getName()));
- }
+ 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 )
{
@@ -772,7 +789,6 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
pCodeCompleteWnd->ResizeListBox();
pCodeCompleteWnd->SelectFirstEntry();
pEditView->GetWindow()->GrabFocus();
- //pEditView->EnableCursor( true );
}
}
}
@@ -822,6 +838,34 @@ void EditorWindow::KeyInput( const KeyEvent& rKEvt )
}
}
+std::vector< OUString > EditorWindow::GetXIdlClassMethods( Reference< reflection::XIdlClass > xClass ) const
+{
+ Sequence< Reference< reflection::XIdlMethod > > aMethods = xClass->getMethods();
+ std::vector< OUString > aRetVect;
+ if( aMethods.getLength() != 0 )
+ {
+ for(sal_Int32 l = 0; l < aMethods.getLength(); ++l)
+ {
+ aRetVect.push_back(OUString(aMethods[l]->getName()));
+ }
+ }
+ return aRetVect;
+}
+
+std::vector< OUString > EditorWindow::GetXIdlClassFields( Reference< reflection::XIdlClass > xClass ) const
+{
+ Sequence< Reference< reflection::XIdlField > > aFields = xClass->getFields();
+ std::vector< OUString > aRetVect;
+ if( aFields.getLength() != 0 )
+ {
+ for(sal_Int32 l = 0; l < aFields.getLength(); ++l)
+ {
+ aRetVect.push_back(OUString(aFields[l]->getName()));
+ }
+ }
+ return aRetVect;
+}
+
void EditorWindow::Paint( const Rectangle& rRect )
{
if ( !pEditEngine ) // We need it now at latest
@@ -2620,7 +2664,7 @@ void CodeCompleteListBox::SetVisibleEntries()
void CodeCompleteListBox::KeyInput( const KeyEvent& rKeyEvt )
{
- std::cerr << "CodeCompleteListBox::KeyInput" << std::endl;
+ //std::cerr << "CodeCompleteListBox::KeyInput" << std::endl;
sal_Unicode aChar = rKeyEvt.GetKeyCode().GetCode();
if( ( aChar >= KEY_A ) && ( aChar <= KEY_Z ) )
{
@@ -2654,13 +2698,9 @@ void CodeCompleteListBox::KeyInput( const KeyEvent& rKeyEvt )
InsertSelectedEntry();
break;
case KEY_UP: case KEY_DOWN:
- std::cerr << "up/down ke in CodeCompleteListBox::KeyInput" << std::endl;
- //GrabFocus();
+ //std::cerr << "up/down ke in CodeCompleteListBox::KeyInput" << std::endl;
NotifyEvent nEvt( EVENT_KEYINPUT, NULL, &rKeyEvt );
PreNotify(nEvt);
- //pCodeCompleteWindow->pParent->GrabFocus();
- //SetVisibleEntries();
- //pCodeCompleteWindow->pParent->GrabFocus();
break;
}
}