How to deselect text in a `ICoreWebView2` control? - webview

Assume that we have 2 ICoreWebView2 controls in a panel, and they are X and Y. When there is any text selected in X, if we then select text in Y, we can observe that the text we selected in X is still selected, even though X has lost keyboard focus, which is now in Y.
How do we "deselect all" in X, when X loses keyboard focus?
By the way, this (deselecting all in X) is the default behavior on WebKit2, but ICoreWebView2 has different behavior. To make our application cross-platform, we need them to have the same behavior so that other codes won't be confused by multiple selected texts. Thanks.

Problem solved! Just call this JavaScript function on X, whenever Y gets the keyboard focus.

Related

Weird behavior for textarea in diagrams.net (draw.io) format panel

I'm facing a very weird (& blocking) issue using diagrams.net webapp.
I'm trying to add some nodes in the Format Panel. I created a new tab in this panel & added in it some new inputs.
There are text inputs, checkbox inputs & textarea.
But the behavior is absolutely not the expected one.
For text & cb inputs, everything works fine, but textareas behavior is... at least very weird:
The field can't get focus by mouse clicking (remember that click works on other inputs). The only way to set the focus on it is by using JS focus() method.
Text inside the tag can't be selected by mouse. If element has the focus, text can be updated. Moreover, even if text can be changed, text cursor cannot move from the end of the text.
Textarea box is not resizable. There is the bottom-right arrow to resize it & I added the "resize" value to be sure but the feature doesn't disable but I juste can't. BUT ! If I set the attribute "disabled" then I can resize the box. Unfortunately, I can't disable the textarea since I want to put it because I need to write in it.
I can't show you code for now (it's just a new node creation using document.createElement) but you can easily test this: go to drawio webapp & when the webapp is loaded, use the Inspector in the developer tools to add a new textarea node in the format panel (div with ".geFormatContainer" class) : element is not focusable with the mouse, text inside it is unselectable & box is not resizable as long as "disabled" attribute is not set.
I added a click listener in the component to check if click did something & it does, but it doesn't give the focus to the element (document.activeElement says that body is focused -_-) so I think there is something in mxgraph which avoids the element's classic behavior. But what ?

Xcodes UI Testing - Tapping an x y location

I am trying to tap an x, y location, while using Xcode and UI Testing. Here is my code:
XCUIApplication().coordinateWithNormalizedOffset(CGVector(dx: 50, dy: 50)).tap()
The middle of the button is definitely at that location and cannot be identified as an individual object (hence using the x, y coordinates).
However, this is not pressing the button. Anyone know if there is a correct way of tapping an x y coordinate?
The dx and dy are not pixel offsets but normalized vectors. For example, 0.5 is actually the middle of the element. Your code is trying to tap an element outside of the screens bounds (by ~50x!).
I suggest trying to solve the problem with a different approach. First off, why can't the button be identified? What have you tried? Are you using a custom UIButton subclass?
I ask because you can (usually) expose any control or UI element to UI testing with the right accessibility attributes. For example, you can set accessibilityLabel and accessibilityIdentifier to the button's text. Then you can use that value to access the button under test.
// Production Code
let button = UIButton()
button.setTitle("Save", forState: .Normal)
button.accessibilityIdentifier = "Save"
// UI Test Code
```
let app = XCUIApplication()
app.buttons["Save"].tap()
You can use dx: 1.5 to click 50% to the right of an element. I used this on an app that has a a webView that I don't control.

Increase/Decrease a field in OpenOffice Calc

I'm trying to count (and sum up) different (physical) items and input those counts in a spreadsheet. Is there a way to increase (or decrease) an integer in a field in OpenOffice Calc? Mouse or keyboard input.
Either a shortcut+macro combination or something along the lines of these (fictive) arrows:
i.e. pressing up would increase the field to value 43
In fact I would be happy for any suggestion for an open programme that would digitalize such input and produce some sort of csv or similar output.
Via View - Toolbars - Form Controls get the toolbar Form Controls visible.
There you have Spin Button control (see tooltips).
Insert this on the sheet by clicking it and pull the size of it with the mouse. Pull it longer than width.
Right click the control and select Control... from the context menu.
On the Data tab set the Linked cell to A3 for example.
Now switch the design mode to off by clicking the corresponding button at the toolbar Form Controls (see tooltips).

Creating a ComboBox with one or more separator items?

I'm using Delphi7 and I'd like to have a ComboBox with separator items (Just like in popup menus).
I've seen this beautifully implemented in Mozilla Sunbird (I know, it's not Delphi...) the following way:
The separator item is a simple gray line
drawn in the center of the item
If you hover over the separator with
the mouse, the selection doesn't
appear
If the user clicks the separator,
it's not selected either AND the
combobox doesn't closeup.
No. 1 could be implemented using DrawItem. I could live without No. 2 because I have no idea about that.
For No. 3 I'm asking for your help. I've figured out that straight after closing up a CBN_CLOSEUP message is sent to the combobox.
I thought about hooking the window proc and if CBN_CLOSEUP is sent to a certain combobox then countering it. But I'm unsure if this is the best solution, or maybe there are other, more elegant ways?
Whatever the solution is, I'd like to have a standard ComboBox which supports WinXP/Vista/7 theming properly.
Thanks!
Edit: For a working component please see this thread:
Can you help translating this very small C++ component to Delphi?
I played around with making unclickable separator items (as described in this answer) and ran into several UI glitches. The problem is that combo boxes have several aspects to their behavior that can be hard to get exactly right:
Pressing the up and down arrow keys navigates the list while the list is dropped down.
Pressing Enter closes the dropped down list, selecting the current item.
Pressing Escape closes the dropped down list, selecting the current item (if the current item was chosen with the up and down arrow keys) or the last selected item.
If the combo box has the focus, then pressing the up and down arrow keys to changes the current selection without displaying the list.
If the combo box has the focus, then typing anything selects the combo box item matching whatever is typing.
If the combo box has the focus, then pressing F4 drops down the combo box list, which can then be controlled by keyboard or mouse.
Ensuring that disabled separator items don't respond to any of these events (plus any other events which I may be missing, e.g., screen readers?) seems fraught with error.
Instead, the approach I'm using is to draw the separator as part of the item:
Use a variable height owner draw combo box.
Add 3 pixels to the height for any items that need separators.
Draw a horizontal line at the top of each item needing a separator.
Here's some C++Builder code to accomplish this; translating it to Delphi should be easy enough.
void __fastcall TForm1::ComboBox1DrawItem(TWinControl *Control,
int Index, TRect &Rect, TOwnerDrawState State)
{
bool draw_separator = NeedsSeparator(Index) &&
!State.Contains(odComboBoxEdit);
TCanvas *canvas = dynamic_cast<TCustomCombo*>(Control)->Canvas;
canvas->FillRect(Rect);
TRect text_rect = Rect;
// Add space for separator if needed.
if (draw_separator) {
text_rect.Top += 3;
}
canvas->TextOut(text_rect.Left + 3,
(text_rect.Top + text_rect.Bottom) / 2 -
canvas->TextHeight(ComboBox1->Items->Strings[Index]) / 2),
ComboBox1->Items->Strings[Index]);
// Draw a separator line above the item if needed.
if (draw_separator) {
canvas->Pen->Color = canvas->Font->Color;
canvas->MoveTo(Rect.Left, Rect.Top + 1);
canvas->LineTo(Rect.Right, Rect.Top + 1);
}
}
void __fastcall TForm1::ComboBox1MeasureItem(
TWinControl * /* Control */, int Index, int &Height)
{
Height = ComboBox1->ItemHeight;
// Add space for the separator if needed.
if (Index != -1 && NeedsSeparator(Index)) {
Height += 3;
}
}
What you want is an owner-drawn combobox. See this: http://delphi.about.com/od/vclusing/a/drawincombobox.htm
Also, this seems to solve making the item unclicable:
http://borland.newsgroups.archived.at/public.delphi.vcl.components.using.win32/200708/0708225320.html
As far as I know there is no VCL way of doing that, so you'll have to subclass the combobox. It would be nice to create component encapsulating those functionalities so you can reuse them easily.
God bless
If you want your controls to look good use the free SpTBXLib. It supports combo style components which popup a popup menu with lines.

Check out whether or not Focus Rect is required (Delphi)

Imagine that we have a form with two buttons on it. I run the application and I click on the first button. nothing happens and no focus rectangle is displayed. But when I press a key, it shows a focus rect on the button and even if I click on the second one, it moves the focus rect to it. So it doesn't display the focus rect unless I press a key. I'm creating my own component and I need to know whether or not I should display the focus rect to draw it.
How do I know it?
I think it's not meant to display the focus rectangle by default, that's until a keyboard accelerator is used. Read UI State on MSDN, that suggests WM_QUERYUISTATE should be used to determine if keyboard accelerators or focus indicators should be drawn or not.

Resources