Re: [api-dev] Replaceing selected text with Basic Macro

2007-04-21 Thread Johnny Andersson

Thank you all for your replies.

My last question never got answered (the one about re-selecting a multi
selection), so I guess I should ask it again in a new thread and also do
more experiments on my own.

Johnny Andersson

2007/4/17, Mathias Bauer [EMAIL PROTECTED]:


Johnny Andersson wrote:

 In your example you go for an object directly:
 ThisComponent.CurrentSelection(0).
 In my example I do like this to obtain the same (?) thing:
 ThisComponent.getCurrentSelection().getByIndex(0)

Simplified explanation: in Basic this is the same. In fact the first
variant is automatically translated into the second one internally as
the real C++ objects only understand that one.

 My thought was something like since there is a method, it is probably
 supposed to be used.

That's not like Basic developers want to have it. :-)
So we added the syntactic sugar to our Basic to meet expectations.

 On the other hand, if ThisComponent.CurrentSelection(0) is possible to
do,
 that object is obviously not private, so I should feel free to use it.

*Every* object is private in UNO based development. There is no way to
access any data of a UNO object directly, not in Basic and not in any
other programming language. Private doesn't mean not accessible. It
means that you can access the bits of it of directly, only its
interface. This is the basic building principle of UNO and there is no
way to circumvent it.

So an object TheObject might contain another object TheSubObject. In UNO
API it might expose this object by offering the method getTheSubObject()
or even allow to overwrite this object with another instance by offering
the method setTheSubObject().

Basic analyses the API of the UNO object at runtime and every time when
it finds a getSomething() method in it it simulates a property type
member of the Basic object representing the UNO object. If it also finds
a setSomething() method it allows to assign an instance to it
otherwise the property is read-only. So in my example you can write
TheObject.TheSubObject.doSomething() if TheObject has this
getTheSubObject method and the returned object has a method
doSomething.

 Which is the proper way to do things? Is the rule that if a variable
or
 an object is private, use their methods, otherwise manipulate them
 directly?

As I said, you can't manipulate any UNO object directly, whatever syntax
you use. You always use its UNO interface, with sugar in Basic or
without in C++ or Java. In Basic you should take the simpler syntax to
improve the readability of your code but that's a matter of taste.

Ciao,
Mathias

--
Mathias Bauer (mba) - Project Lead OpenOffice.org Writer
OpenOffice.org Engineering at Sun: http://blogs.sun.com/GullFOSS
Please don't reply to [EMAIL PROTECTED].
I use it for the OOo lists and only rarely read other mails sent to it.

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




Re: [api-dev] Replaceing selected text with Basic Macro

2007-04-18 Thread Mathias Bauer
Johnny Andersson wrote:

 In your example you go for an object directly:
 ThisComponent.CurrentSelection(0).
 In my example I do like this to obtain the same (?) thing:
 ThisComponent.getCurrentSelection().getByIndex(0)

Simplified explanation: in Basic this is the same. In fact the first
variant is automatically translated into the second one internally as
the real C++ objects only understand that one.

 My thought was something like since there is a method, it is probably
 supposed to be used.

That's not like Basic developers want to have it. :-)
So we added the syntactic sugar to our Basic to meet expectations.

 On the other hand, if ThisComponent.CurrentSelection(0) is possible to do,
 that object is obviously not private, so I should feel free to use it.

*Every* object is private in UNO based development. There is no way to
access any data of a UNO object directly, not in Basic and not in any
other programming language. Private doesn't mean not accessible. It
means that you can access the bits of it of directly, only its
interface. This is the basic building principle of UNO and there is no
way to circumvent it.

So an object TheObject might contain another object TheSubObject. In UNO
API it might expose this object by offering the method getTheSubObject()
or even allow to overwrite this object with another instance by offering
the method setTheSubObject().

Basic analyses the API of the UNO object at runtime and every time when
it finds a getSomething() method in it it simulates a property type
member of the Basic object representing the UNO object. If it also finds
a setSomething() method it allows to assign an instance to it
otherwise the property is read-only. So in my example you can write
TheObject.TheSubObject.doSomething() if TheObject has this
getTheSubObject method and the returned object has a method doSomething.

 Which is the proper way to do things? Is the rule that if a variable or
 an object is private, use their methods, otherwise manipulate them
 directly?

As I said, you can't manipulate any UNO object directly, whatever syntax
you use. You always use its UNO interface, with sugar in Basic or
without in C++ or Java. In Basic you should take the simpler syntax to
improve the readability of your code but that's a matter of taste.

Ciao,
Mathias

-- 
Mathias Bauer (mba) - Project Lead OpenOffice.org Writer
OpenOffice.org Engineering at Sun: http://blogs.sun.com/GullFOSS
Please don't reply to [EMAIL PROTECTED].
I use it for the OOo lists and only rarely read other mails sent to it.

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [api-dev] Replaceing selected text with Basic Macro

2007-04-17 Thread Johnny Andersson

2007/4/17, Paolo Mantovani [EMAIL PROTECTED]:


Alle 00:31, martedì 17 aprile 2007, Johnny Andersson ha scritto:
 I have a small problem that I just can't figure out at these late hours
 (00:13 right now):

 I have written a macro that reads highlighted text and replaces it with
 something else (which is calculated by the macro).

 To read the highlighted text I use ThisComponent.getCurrentSelection
 ().getByIndex(0).getString().

 This caused me no problems, however I couldn't figure out the parameter
in
 getByIndex(0). Why 0? What does it mean? 0 what? I tried 1 and 2 but
they
 only caused errors.

Because the getCurrentSelection() method in writer normally gets a
com.sun.star.text.TextRanges (that is a container)
In general it contains at least one TextRange, but in case of multiple
selection it contains more elements.
Use the getCount() method to discover how many TextRanges are actually
selected



Oh, I see. I didn't realize that it was possible to have more than one
selection in Writer (I knew it's possible in Calc though), but a quick test
with the Ctrl key certainly proves to me that it's possible. Yes, maybe I
should include that possibility in my macro, so not only the first (or
rather 0th...) selection is handled.


Ok, I guess I can figure that one out myself with some help from Google,
so
 here is my real question:

 When I replace the highlighted text, I do that with
 ThisComponent.getCurrentSelection().getByIndex(0).setString(MyString).
The
 problem is that I want the new inserted string also to be highlighted,
so I
 can perform the macro on it without having to highlight it manually.

 Any ideas? Is there some better way to do this?

 Just an example to illustrate what I mean:
[]

Hoping that I have correctly understood your example, the following code
should do (more or less) what you need.
Check the Andrew Pitonyak's macro document for better techniques and
examples

---8---
REM  *  BASIC  *

Sub Main

oRange = ThisComponent.currentselection(0)
oText = oRange.getText()

oCursor = oText.createTextCursorByRange(oRange)
bAbsorb = True
oText.insertString( oRange, new string, bAbsorb)

'restore selection
ThisComponent.CurrentController.select(oRange)

End Sub
---8---


ciao
Paolo M

I haven't tried your suggestion yet, but I will as soon as possible.


Just one follow-up-question, if you don't mind:

The objects we are talking about here, ThisComponent and its sub objects (or
whatever I should call them), contain other objects, variables and methods
etc, right? Many years ago when I studied some C++ (which I never used since
then, sorry...) I was told that when created classes, it was a good idea to
keep variables private and do most things with them through public local
methods.

To me it felt like the proper thing to do is to always use local methods for
everything, when it comes to changing values and contents of things.

In your example you go for an object directly:
ThisComponent.CurrentSelection(0).
In my example I do like this to obtain the same (?) thing:
ThisComponent.getCurrentSelection().getByIndex(0)

My thought was something like since there is a method, it is probably
supposed to be used.
On the other hand, if ThisComponent.CurrentSelection(0) is possible to do,
that object is obviously not private, so I should feel free to use it.

Which is the proper way to do things? Is the rule that if a variable or
an object is private, use their methods, otherwise manipulate them
directly?

Or is it always use the method designed for what you want to do with the
variable/object?

Or is it something else?



Johnny Andersson


Re: [api-dev] Replaceing selected text with Basic Macro

2007-04-17 Thread Johnny Andersson

I was playing around a bit with the ThisComponent.CurrentSelection.getCount()
function and I found that when I had one selection,
ThisComponent.CurrentSelection.getCount() returned 1, but when I had more
than one selection (and I am still talking about Writer),
ThisComponent.CurrentSelection.getCount() returned the number of selections
+ 1 for some reason. In the same case,
ThisComponent.CurrentSelection(0).getText()
returns an empty string. ThisComponent.CurrentSelection(1).getText() and
ThisComponent.CurrentSelection(2).getText() contains what's selected,
however.

Is this what always happens or did I do something wrong? I tried it a few
times only. Do I have to check for this or can I just assume that if
ThisComponent.CurrentSelection.getCount()  1 then
ThisComponent.CurrentSelection(0).getText() is always empty?

Johnny Andersson


Re: [api-dev] Replaceing selected text with Basic Macro

2007-04-17 Thread Johnny Andersson

I am sorry to bother again. Actually, i made the whole thing to work
properly now.

However i ran into a new problem:

I modified the macro to make it possible to handle several selections. The
problem is, that when i restore the selection,
ThisComponent.CurrentController.select(oRange) in your example, I can only
restore one selection. I have tried for some hours now to make it possible
to restore a multi-selection, but I failed constantly.

Let's say that I highlight three parts in a text, by clicking and dragging
while the Ctrl key is held. Then the macro can handle each one of them,
that's no problem. I get my text replaced and everything is OK, until the
end of the macro.

So what do I want to happen at the end? Well, I want to restore the
selections. Not just one of them, ALL of them. Just to make it possible to
run the same macro again on the same selections.

I use some global variables to record what the macro did last time, and
next time I run it I want it to do something else to the same text.

Well, if you really want to know, I am trying to make my own
Uppercase-Lowercase conversion, to use instead of the built in Change Case
function. I am also doing it to learn about macros.

So I assigned the macro to Shift+F3. My thought is that first time I hit
Shift+F3, all selected characters are converted to Uppercase.

Second time the macro is run, it will convert to lowercase (if the selection
didn't change since last time).

Third time, it will convert to Sentence case (first letter after .  (point
+ space) and after :  will be Uppercase, other characters won't change).

Fourth time, it's Title Case.

Fifth time it toggles from the ORIGINAL case (which therefore has to be
remembered the first time the macro runs on a specific selection/multi
selection).

Sixth time it toggles back again to its original state.

Seventh time is the same as first time and so on.


So, that's why the multi selection needs to stay there after the macro
finished.

At the moment I just can not figure out (maybe because I am really stupid)
how to do this. Everything else is working and it works as long as I don't
do multi selections.

Johnny Andersson


Re: [api-dev] Replaceing selected text with Basic Macro

2007-04-17 Thread Mathias Röllig
Am 17.04.2007 11:45 schrieb Johnny Andersson:

 Is this what always happens or did I do something wrong?

I think no (twice).

I filed a issue:
 http://api.openoffice.org/issues/show_bug.cgi?id=76449


Greetings MRoe
-- 
·-· cut here ·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-·-8·-·

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: [api-dev] Replaceing selected text with Basic Macro

2007-04-17 Thread Andrew Douglas Pitonyak

Mathias Röllig wrote:

Am 17.04.2007 11:45 schrieb Johnny Andersson:

  

Is this what always happens or did I do something wrong?



I think no (twice).

I filed a issue:
 http://api.openoffice.org/issues/show_bug.cgi?id=76449


Greetings MRoe
  

I replied to the issue, but I would have said that it was not a bug.
I provided code to demonstrate what is really happening here. It may be 
a bug, but it has been this way since version 1.0.


--
Andrew Pitonyak
My Macro Document: http://www.pitonyak.org/AndrewMacro.odt
My Book: http://www.hentzenwerke.com/catalog/oome.htm
Info:  http://www.pitonyak.org/oo.php
See Also: http://documentation.openoffice.org/HOW_TO/index.html

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



[api-dev] Replaceing selected text with Basic Macro

2007-04-16 Thread Johnny Andersson

I have a small problem that I just can't figure out at these late hours
(00:13 right now):

I have written a macro that reads highlighted text and replaces it with
something else (which is calculated by the macro).

To read the highlighted text I use ThisComponent.getCurrentSelection
().getByIndex(0).getString().

This caused me no problems, however I couldn't figure out the parameter in
getByIndex(0). Why 0? What does it mean? 0 what? I tried 1 and 2 but they
only caused errors.
Ok, I guess I can figure that one out myself with some help from Google, so
here is my real question:

When I replace the highlighted text, I do that with
ThisComponent.getCurrentSelection().getByIndex(0).setString(MyString). The
problem is that I want the new inserted string also to be highlighted, so I
can perform the macro on it without having to highlight it manually.

Any ideas? Is there some better way to do this?

Just an example to illustrate what I mean:

Here is a sentence that will *illustrate* my example.

I hope you can see that one word (illustrate) in the sentence above is
underlined. That is supposed to illustrate that it is highlighted.

Ok, now I run my macro (this is a fake example, my macro does something
else) and now it looks like this:

Here is a sentence that will show my example.

As you hopefully can see, nothing is now underlined, however the cursor is
placed right after the word show. What I want, is that the word shows in
this case should be highlighted after the macro was run:

Here is a sentence that will *show* my example.

This would make it possible to run the macro once again and get the
following result (still a fake example):

Here is a sentence that will *help you to understand* my example.

And so on...

Thanks in advance


Johnny Andersson


Re: [api-dev] Replaceing selected text with Basic Macro

2007-04-16 Thread Paolo Mantovani
Alle 00:31, martedì 17 aprile 2007, Johnny Andersson ha scritto:
 I have a small problem that I just can't figure out at these late hours
 (00:13 right now):

 I have written a macro that reads highlighted text and replaces it with
 something else (which is calculated by the macro).

 To read the highlighted text I use ThisComponent.getCurrentSelection
 ().getByIndex(0).getString().

 This caused me no problems, however I couldn't figure out the parameter in
 getByIndex(0). Why 0? What does it mean? 0 what? I tried 1 and 2 but they
 only caused errors.

Because the getCurrentSelection() method in writer normally gets a
com.sun.star.text.TextRanges (that is a container)
In general it contains at least one TextRange, but in case of multiple 
selection it contains more elements.
Use the getCount() method to discover how many TextRanges are actually 
selected


 Ok, I guess I can figure that one out myself with some help from Google, so
 here is my real question:

 When I replace the highlighted text, I do that with
 ThisComponent.getCurrentSelection().getByIndex(0).setString(MyString). The
 problem is that I want the new inserted string also to be highlighted, so I
 can perform the macro on it without having to highlight it manually.

 Any ideas? Is there some better way to do this?

 Just an example to illustrate what I mean:
[]

Hoping that I have correctly understood your example, the following code 
should do (more or less) what you need.
Check the Andrew Pitonyak's macro document for better techniques and examples

---8---
REM  *  BASIC  *

Sub Main

oRange = ThisComponent.currentselection(0)
oText = oRange.getText()

oCursor = oText.createTextCursorByRange(oRange)
bAbsorb = True
oText.insertString( oRange, new string, bAbsorb)

'restore selection
ThisComponent.CurrentController.select(oRange)

End Sub
---8---


ciao
Paolo M

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]