Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [platform-swt-dev] Mouse selections in StyledText and TextViewer


I'm guessing he has a Cut Action on the Toolbar/Menu, and that action is a SelectionListener.
Since selection wasn't firing automatically, the action would not update enabled state until he forced selection to fire.



"Knut Radloff" <knut_radloff@xxxxxxx>
Sent by: platform-swt-dev-admin@xxxxxxxxxxx

09/19/2002 10:20 AM
Please respond to platform-swt-dev

       
        To:        platform-swt-dev@xxxxxxxxxxx
        cc:        
        Subject:        Re: [platform-swt-dev] Mouse selections in StyledText and TextViewer

       


I'd like to understand why copy/cut doesn't work in your case.
Are you implementing your own copy/cut behavior or are you just calling
StyledText.copy? If you invoke StyledText.copy and have previously changed
the selection using StyledText API the selection should be copied to the
clipboard. You should not have to call notifyListener. Anything else is a
bug and you should open a bug report (please include the code that fails).
Selection API never sends selection events. This is standard SWT behavior.


Fine grained navigation customization like you and Alan suggest was not a
requirement before. That is why customization is limited to remapping of
existing actions to other key strokes. We (SWT) don't like to add features
and functions that are not needed. It just adds to maintenance effort and
bloats the API. If we find that better customization is in fact needed we
are open to adding it (especially if we don't have to implement it <g>).

We envision the callback we mention below to be issued during each
navigation action (keyboard and mouse). It could have the default
navigation result computed by StyledText(caret offset), doit flag to
suppress the navigation entirely and select flag to enable/disable
selection. A listener could change the caret offset and the flags. The
navigation would execute all the code and sideeffects that normally run as
part of navigation, just with the user provided caret offset. This would
allow you to change any navigation action, not just word navigation.

Other than the keyboard word navigation what else did you override? Any
mouse navigation? Does the proposed API/callback seem like it would
sufficiently support what you are trying to do?

Knut





"Bob Foster" <bob@xxxxxxxxxx>
Sent by: platform-swt-dev-admin@xxxxxxxxxxx
09/18/2002 02:57 PM
Please respond to platform-swt-dev


       To:     <platform-swt-dev@xxxxxxxxxxx>
       cc:
       Subject:        Re: [platform-swt-dev] Mouse selections in StyledText and TextViewer

JFace aside, some changes are needed in StyledText. I have overridden the
navigation key behaviors in an editor, using addVerifyKeyListener() from
SWT. My first thought, like Alan's I guess, was to look for the hook to
replace the definition of a 'word'. I was very surprised to see the
definition hard-coded in StyledText - talk about low-level
decision-making! - with no way to override it. addVerifyKeyListener()
requires you to change all of the behavior of the key or none. As Alan
says, this is requires you to duplicate internal StyledText functionality,
which may not be obvious.

For example, changing the behavior of CONTROL+SHIFT+ARROW_left-or-right
requires setting the selection. However, none of the public selection
setting methods notify selection listeners, so, e.g., a subsequent Copy or
Cut doesn't work. To work around this I had to explicitly call
text.notifyListeners(SWT.Selection, event), which assumes way more
internal behavior than I would have liked.

Even if there is such a method that I missed, implementing this required
way too much code reading. ;-}

My $.02.

Bob
----- Original Message -----
From: Lynne Kues
To: platform-swt-dev@xxxxxxxxxxx
Sent: Wednesday, September 18, 2002 12:03 PM
Subject: RE: [platform-swt-dev] Mouse selections in StyledText and
TextViewer


Alan, thanks for your comments and ideas.  We have added our two cents and
you may not agree with everything we say, but lets keep talking...

You seem like you are interested in changing the basic Eclipse editor
behavior.  As we indicate below, the way to do this is in JFace Text.  The
StyledText widget is a low-level widget, designed not only for Eclipse
editors.  Some of the abstractions you would like ** do ** make sense, but
from an SWT standpoint these abstractions would better exist in JFace -
not SWT.  We elaborate on this more below...

Lynne & Knut

----- Forwarded by Lynne Kues/RAL/OTI on 09/17/2002 09:23 AM -----

"Alan Oursland" <alan@xxxxxxxxxxxx>
Sent by: platform-swt-dev-admin@xxxxxxxxxxx
09/16/2002 05:42 PM
Please respond to platform-swt-dev
       
       To:        <platform-swt-dev@xxxxxxxxxxx>
       cc:
       Subject:        RE: [platform-swt-dev] Mouse selections in
StyledText and TextViewer


I went through the plug-in development tutorials on eclipse.org when I
started looking at 2.0. It would probably be helpful to revisit them.

I am not really interested in just extending the behavior of the Java
editor. I want the same basic functionality for my editor regardless of
the
type of file I am editing. And, like most people, I want that
functionality
to work like the editor to which I am accustomed.

When editing a generic text file, double-clicking to select words did not
operate the way I expected (try opening a text file, double click, and
drag). Since eclipse is open source, I thought I would figure out how to
fix
it instead of filing a bug report and waiting for a fix. What I found in
the
code was that some of the UI handling was being done in StyledText and
some
of it in TextViewer. The code in StyledText looked like it operated
correctly, but the functionality was overridden TextViewer with an
implementation that didn't work correctly, seemed overly specific, and
lacked customization ability. Some of the overly specialized code seems to
have leaked into StyledText as well (setDoubleClickEnabled?). I am not
sure
why TextViewer developers felt the need to reimplement functionality. I
suspect they wanted to do something that StyledText didn't let them easily
change.

I'm not sure why TextViewer changed the double click behavior either -
would be a good question for the newsgroup.  Even so, if you want to
customize the StyledText's double click behavior, the way to do this is to
setDoubleClickEnabled(false) and then provide your own behavior.  This is
what the TextViewer does.  The way to change the behavior for all of your
Eclipse editors would be to supply your own double click strategy for
TextViewers.

I probably don't have a good enough model of the purpose of StyledText,
but
it seemed to me that making StyledText more customizable would be a good
step towards getting the UI features that I want.

The StyledText widget is a generic text widget.  It does not exist solely
to support the Eclipse editors.  When you think of Eclipse editor
behavior, you should be thinking of JFace Text, not the StyledText widget.
The StyledText is just a building block and its goal is to provide a
customizable text widget.  Its default behavior is based on the lowest
common denominator (think Notepad).

StyledText has bidi (which I find phenomenally impressive) and single-line
modes which introduce navigation subtleties. Overriding the navigation
capabilities of StyledText seems like a bad idea. Classes overriding this
behavior would need to reimplement that subtle behavior. If a bug is fixed
in StyledText, or a new feature is added, the changes would need to
propagated to several pieces of code. Overall it sounds like a maintenance
nightmare for developers and a bug nightmare for users. If I am correct
that
the navigation functionality shouldn't be overridden, then StyledText
should
provide ways to customize navigation. Currently, CTRL-ARROW_RIGHT
navigates
across words where a word is defined by the method getWordEnd(). If I want
to change the definition of a word according to a specific language, I
either need to override the class and method (which isn't how TextViewer
works), or reimplement the navigation (and introduce subtle bugs).

The changes I proposed in the previous message were really just a first
step
of an effort to try to generalize navigation and selection in StyledText
so
that other classes can customize the behavior better. These changes
include:
  - abstraction of navigation.
  - addition of a selection mode.
  - customization of navigation steps

Support for customizing selection (both mouse and keyboard) is a valid
request.  Handling this would entail something like
setSelectionEnabled(boolean) or providing a callback like the
VerifyKeyEvent in which we would pass what we're about to select and one
could set the doit flag to false if they didn't want the default select to
occur.  Then the StyledText user could provide the selection behavior they
wanted.  This approach maintains the SWT-way.

Currently, selection and navigation are handled separately. Accessibility
design discourages the use of frequent multiple key commands. It should be
possible to perform actions like SHIFT-ARROW_RIGHT using single keys. One
way I have seen this done is to do this is to make selection a mode. If I
turn selection on and press ARROW_RIGHT, it does the same thing that
SHIFT-ARROW_RIGHT does.
For example, the code mapped to ARROW_RIGHT might look like:
  doCursorNext();
The code mapped to SHIFT-ARROW_RIGHT might look like:
  setSelectionMode(true);
  doCursorNext();
  setSelectionMode(false);

setSelectionMode has the following behavior:
- If set to true and there is currently a selection, just set the
selection
mode to true.
- If set to true and there is not currently a selection, record the
current
caret position and set selection mode to true
- If set to false, set the select mode flag to false.

This behavior (setSelectionMode) could currently be implemented with the
StyledText API.  You could keep track of the "single keystroke select
mode" and map cursorNext to selectCursorNext, etc. when in this mode.

Depending on the language I am using, a 'word' might be defined
differently.
I may always want CTRL-ARROW_RIGHT to the next word, but I want the word
definition to change based on the type of document I am editing. If
StyledText should be handling all navigation, then it should provide a way
to change navigation blocks. Again, for accessibility reasons, it would be
good to have a navigation mode.
For example, the code mapped to ARROW_RIGHT might look like:
  doCursorNext();
The code mapped to CTRL-SHIFT-RIGHT might look like:
  setNavigationMode(wordLexar);
  setSelectionMode(true);
  doCursorNext();
  setSelectionMode(false);
  setNavigationMode(defaultLexar);

IDocument has the interface IDocumentPartitioner, but it seems to be
designed to maintain a lot of state about a specific document. Because
navigation generally deals with partition boundaries adjacent to a single
point, runtime lexing is probably sufficient (which is what the code does
now anyway). An IContentPartitioner with methods "int nextPartition(int,
StyledTextContent)" and "int prevPartition(int, StyledTextContent)" is
probably sufficient.

doCursorNext() would be generalized to perform all of the "next"
navigation
and would look something like:
  int newOffset;
  int newLine;
  if( isSelectionOn() == false && selection.y - selection.x > 0 ) {
      caretOffset = selection.y;
      caretLine = content.getLineAtOffset(caretOffset);
      showCaret();
  } else {
      newOffset = partitioner.nextOffset( caretOffset, content );
      newLine = content.getLineAtOffset(newOffset);
      // only go to next line if not in single line mode. fixes 5673
      if( !isSingleLine() || newLine == caretLine ) {
          // Remember the last direction. Always update
lastCaretDirection,
          // even though it's not used in non-bidi mode in order to avoid
          // extra methods.
          lastCaretDirection = ST.COLUMN_NEXT;
          caretOffset = newOffset;
          caretLine = newLine;
          showCaret();
      }
  }

To recap, what you would like to do is have a way to define what a
word/line/etc. is and to be able to use this definitions for your specific
navigation and selection purposes.  Right?  Currently, the StyledText
widget will let you remap your navigation keys and you could override
selection behavior (if we add the support for this or you can try doing it
via hooking MouseEvents), but even so, you feel this is not sufficient
because of the "what is a word/line/etc" concept?  

We're not sure how this should be handled.  However, leaking JFace Text
into the StyledText widget is not acceptable.  Concepts of partitions,
etc. are JFace-related.  If we wanted to support this "word/line/etc"
concept in the StyledText widget, we would have to do something much more
basic/low-level.  For example, providing a callback during keyboard
navigation in which one could provide a different caret offset.

What do these changes buy?
- they make sure that navigation in editors using StyledText happen
correctly regardless of the settings in StyledText
- they allow editors based on StyledText to customize functionality
without
reinventing the wheel.
- better code reuse. It combines similar function and pulls other generic
functionality into new classes (like finding the next word). Smaller class
files are generally easier to understand and maintain.
- better accessibility support

Could this be done with a plug-in? Maybe, but the intent of the proposed
changes is to improve the generality of the library so the jface editor
doesn't have to try to reimplement functionality.

The place to do this is in a plugin or JFace Text.  We can provide
low-level support in the StyledText widget, but the majority of the
"smarts" will have to be in JFace or a plugin.  How to do this from a
JFace standpoint should be posted to the newsgroup.  We really think you
should introduce your own plugin.  If it turns out that you cannot do what
you want easily (once we give you the low-level SWT support you would
need) with the existing API, extension points, etc., then you should post
to the platform.ui.dev mailing list.

I am also willing to write this myself if you guys are too busy. I want to
make sure it will get used before I work on it though. If you have junit
tests for StyledText it should be pretty easy to make the changes
transparent to the rest of the system.

Okay, we would need to first decide upon SWT-like API.  Then you could
submit the changes.  The changes would have to be reviewed.  Note that
StyledText junit tests exist, but these do not address keyboard
navigation.  You could add these as part of any changes you submit (you
would have to code something based on invokeAction and there would be a
lot of variations).  The junit tests are in the org.eclipse.swt.tests
project.

Alan Oursland

-----Original Message-----
From: Lynne Kues [mailto:Lynne_Kues@xxxxxxx]
Sent: Friday, September 13, 2002 2:25 PM
To: alan@xxxxxxxxxxxx
Cc: knut_radloff@xxxxxxx
Subject: Re: [platform-swt-dev] Mouse selections in StyledText and
TextViewer





"Alan Oursland" <alan@xxxxxxxxxxxx>
Sent by: platform-swt-dev-admin@xxxxxxxxxxx
09/12/2002 04:06 PM
Please respond to platform-swt-dev

      To:        <platform-swt-dev@xxxxxxxxxxx>
      cc:
      Subject:        [platform-swt-dev] Mouse selections in StyledText
and TextViewer


I have been looking at the code for selecting text with the mouse in the
text editor. It looks like StyledText implements most of it and then
TextViewer implements it again.

I have also noticed that selection actions are pretty much hardcoded to
the
mouse events.

I would like to rewrite the mouse selection code so that:
a) it works like the editor in MS Visual Studio by default
b) it is customizable

My main reservation with this endeavor is that I have zero understanding
of
how changes will affect plug-ins that other people have written. Could
someone provide any information on this and how I can avoid impact.

Have you looked at the Platform Plug-in Developer and the JDT Plug-in
Development Guides?  These guides discuss how to plug-in to the workbench
in
order to extend the existing behavior.  There is also an example of
creating
a customized Java Editor.

The JavaSourceViewerConfiguration is intended to be used for customizing
the
JavaEditor, but it doesn't look like it gives you what you need.  This is
really a JDT issue (vs. an SWT issue).  The question being "How do I
extend
the Java Editor selection behavior?"  The JavaSourceViewerConfiguration
class references a text editor and if you could access this variable you
could hook the mouse events and provide special processing (see discussion
below), but there is not API for doing this, nor is the class intended to
be
subclassed.

The changed I would like to make are:
I. get rid of IDoubleClickStrategy and all support (affects ITextViewer,
TextViewer, and SourceViewerConfiguration)

Why not just introduce a DoubleClickStrategy that does nothing/what you
want?  As I understand it, this is the intended use of
SourceViewerConfiguration (i.e., you can customize the given behavior).

II. introduce a new more general model for customizing mouse selection in
StyledText where:
              a) A mouse down event (including multi-clicks):
                               - clears the current selection unless
shift
is pressed (shift always
extends selections)
                               - records a selection start position.
                               - uses modifiers (ctrl, alt, click-count)
to find a content partitioning
object.
                               - sets the selection to the left and right
bounds of the partition in
which the mouse was pressed.
                               - begins autoscrolling
              b) A mouse move event
                               - makes sure a mouse drag selection is
taking place
                               - gets the correct content partitioning
based on modifiers
                               - extends the selection to the left and
right bounds of the partitions
that the start position and current mouse position span.
              c) A mouse up event
                               - ends autoscrolling

I think you could do this by hooking the MouseEvents on the StyledText
widget for the editors in which you want this behavior.  Have you tried
this
at all (hooking the events on a StyledText widget and supplying the
additional selection behavior)?  The content partitioning is supported via
JFace Text.  See below.  You shouldn't change StyledText, but either
extend
the existing editors or introduce your own editor.

Content Partitioning objects define partitions within content. I am pretty
sure I remember seeing something like this in Eclipse already, but it
doesn't seem to be associated with StyledTextContent. You might have
different partitioning objects for words, lines, programming scopes, or
whatever. Each editor would be able to map mouse modifiers to their own
custom partitioning object. A default, or null, partitioning object would
indicate single character partitioning.

The org.eclipse.jface.text.* packages have this support.

Note that there is no functional difference between MouseClick and
MouseDoubleClick events. Ideally, this should also be able to handle
triple
clicks, if the event model were to support it.

What this does not support is block selection. To do that, I think that
selection state would need to be encapsulated inside an object, or
multiple
selections would need to be supported in the widget (which doesn't make a
lot of sense to me).

I would appreciate any comments on this.

Alan Oursland


_______________________________________________
platform-swt-dev mailing list
platform-swt-dev@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/platform-swt-dev


_______________________________________________
platform-swt-dev mailing list
platform-swt-dev@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/platform-swt-dev




_______________________________________________
platform-swt-dev mailing list
platform-swt-dev@xxxxxxxxxxx
http://dev.eclipse.org/mailman/listinfo/platform-swt-dev


Back to the top