summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/touch/touch.h7
-rw-r--r--ios/experimental/LibreOffice/LibreOffice/View.m117
-rw-r--r--vcl/ios/iosinst.cxx40
3 files changed, 103 insertions, 61 deletions
diff --git a/include/touch/touch.h b/include/touch/touch.h
index 11440f16062b..9e5c011df708 100644
--- a/include/touch/touch.h
+++ b/include/touch/touch.h
@@ -89,12 +89,17 @@ void touch_ui_selection_none();
// where that is wanted, and this all is work in progress. Prefixed by
// touch_lo_.
+typedef enum { DOWN, MOVE, UP} MLOMouseButtonState;
+typedef enum { NONE, SHIFT, META } MLOModifiers;
+typedef int MLOModifierMask;
+
void touch_lo_keyboard_did_hide();
void touch_lo_runMain();
void touch_lo_set_view_size(int width, int height);
void touch_lo_render_windows(void *context, int minX, int minY, int width, int height);
void touch_lo_tap(int x, int y);
+void touch_lo_mouse(int x, int y, MLOMouseButtonState state, MLOModifierMask modifiers);
void touch_lo_pan(int deltaX, int deltaY);
void touch_lo_zoom(int x, int y, float scale);
void touch_lo_keyboard_input(int c);
@@ -106,8 +111,6 @@ context, contextHeight, contextWidth specify where to draw.
*/
void touch_lo_draw_tile(void *context, int contextWidth, int contextHeight, int tilePosX, int tilePosY, int tileWidth, int tileHeight);
-typedef enum { DOWN, MOVE, UP} MLOMouseButtonState;
-
void touch_lo_mouse_drag(int x, int y, MLOMouseButtonState state);
void touch_lo_selection_attempt_resize(const void *documentHandle,
diff --git a/ios/experimental/LibreOffice/LibreOffice/View.m b/ios/experimental/LibreOffice/LibreOffice/View.m
index 2e5f3ef26e73..44fa6df3aa3d 100644
--- a/ios/experimental/LibreOffice/LibreOffice/View.m
+++ b/ios/experimental/LibreOffice/LibreOffice/View.m
@@ -16,24 +16,12 @@
@property int selectionRectangleCount;
@end
-#define HANDLE_BLOB 20
+#define HANDLE_BLOB 40
#define HANDLE_STEM_WIDTH 6
-#define HANDLE_STEM_HEIGHT 20
+#define HANDLE_STEM_HEIGHT 40
@implementation View
-#if 0
-- (id) initWithFrame:(CGRect)rect
-{
- self = [super initWithFrame:rect];
- if (self) {
- self.selectionRectangles = NULL;
- self.selectionRectangleCount = 0;
- }
- return self;
-}
-#endif
-
- (CGRect) topLeftResizeHandle
{
if (self.selectionRectangleCount == 0)
@@ -166,38 +154,71 @@
- (void)panGesture:(UIPanGestureRecognizer *)gestureRecognizer
{
+ static enum { NONE, TOPLEFT, BOTTOMRIGHT } draggedHandle = NONE;
static CGFloat previousX = 0.0f, previousY = 0.0f;
CGPoint translation = [gestureRecognizer translationInView:self];
- if ([gestureRecognizer numberOfTouches] == 1) {
+ if (gestureRecognizer.state == UIGestureRecognizerStateBegan &&
+ gestureRecognizer.numberOfTouches == 1) {
if (CGRectContainsPoint([self topLeftResizeHandle],
- [gestureRecognizer locationInView:self])) {
-
- self.selectionRectangles[0].origin.x += translation.x;
- self.selectionRectangles[0].origin.y += translation.y;
- self.selectionRectangles[0].size.width -= translation.x;
- self.selectionRectangles[0].size.height -= translation.y;
-
- touch_lo_selection_attempt_resize(self.documentHandle,
- self.selectionRectangles,
- self.selectionRectangleCount);
- return;
- } else if (CGRectContainsPoint([self bottomRightResizeHandle],
- [gestureRecognizer locationInView:self])) {
-
- const int N = self.selectionRectangleCount - 1;
-
- self.selectionRectangles[N].origin.x += translation.x;
- self.selectionRectangles[N].origin.y += translation.y;
- self.selectionRectangles[N].size.width -= translation.x;
- self.selectionRectangles[N].size.height -= translation.y;
-
- touch_lo_selection_attempt_resize(self.documentHandle,
- self.selectionRectangles,
- self.selectionRectangleCount);
- return;
- }
+ [gestureRecognizer locationInView:self]))
+ draggedHandle = TOPLEFT;
+ else if (CGRectContainsPoint([self bottomRightResizeHandle],
+ [gestureRecognizer locationInView:self]))
+ draggedHandle = BOTTOMRIGHT;
+ }
+
+ if (draggedHandle == TOPLEFT) {
+ const int N = self.selectionRectangleCount;
+
+ self.selectionRectangles[0].origin.x += translation.x;
+ self.selectionRectangles[0].origin.y += translation.y;
+ self.selectionRectangles[0].size.width -= translation.x;
+ self.selectionRectangles[0].size.height -= translation.y;
+
+#if 0
+ touch_lo_selection_attempt_resize(self.documentHandle,
+ self.selectionRectangles,
+ self.selectionRectangleCount);
+#else
+ touch_lo_mouse(self.selectionRectangles[0].origin.x,
+ self.selectionRectangles[0].origin.y,
+ DOWN, NONE);
+ touch_lo_mouse(self.selectionRectangles[N-1].origin.x +
+ self.selectionRectangles[N-1].size.width,
+ self.selectionRectangles[N-1].origin.y +
+ self.selectionRectangles[N-1].size.height,
+ UP, NONE);
+#endif
+ if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
+ draggedHandle = NONE;
+ return;
+ } else if (draggedHandle == BOTTOMRIGHT) {
+ const int N = self.selectionRectangleCount;
+
+ self.selectionRectangles[N-1].origin.x += translation.x;
+ self.selectionRectangles[N-1].origin.y += translation.y;
+ self.selectionRectangles[N-1].size.width += translation.x;
+ self.selectionRectangles[N-1].size.height += translation.y;
+
+#if 0
+ touch_lo_selection_attempt_resize(self.documentHandle,
+ self.selectionRectangles,
+ self.selectionRectangleCount);
+#else
+ touch_lo_mouse(self.selectionRectangles[0].origin.x,
+ self.selectionRectangles[0].origin.y,
+ DOWN, NONE);
+ touch_lo_mouse(self.selectionRectangles[N-1].origin.x +
+ self.selectionRectangles[N-1].size.width,
+ self.selectionRectangles[N-1].origin.y +
+ self.selectionRectangles[N-1].size.height,
+ UP, NONE);
+#endif
+ if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
+ draggedHandle = NONE;
+ return;
}
if (gestureRecognizer.state != UIGestureRecognizerStateBegan) {
@@ -238,6 +259,17 @@
}
}
+static int compare_rects(const void *a, const void *b)
+{
+ const CGRect *ra = a;
+ const CGRect *rb = b;
+
+ if (ra->origin.y != rb->origin.y)
+ return ra->origin.y - rb->origin.y;
+ else
+ return ra->origin.x - rb->origin.x;
+}
+
- (void)startSelectionOfType:(MLOSelectionKind)kind withNumber:(int)number ofRectangles:(CGRect *)rects forDocument:(const void *)document
{
(void) kind;
@@ -257,6 +289,9 @@
self.selectionRectangleCount = number;
self.documentHandle = document;
+ // The selection rectangle provided by LO are not sorted in any sane way
+ qsort(self.selectionRectangles, self.selectionRectangleCount, sizeof(self.selectionRectangles[0]), compare_rects);
+
[self requestSelectionRedisplay];
}
diff --git a/vcl/ios/iosinst.cxx b/vcl/ios/iosinst.cxx
index b4e7257b317a..2416bf6c97d5 100644
--- a/vcl/ios/iosinst.cxx
+++ b/vcl/ios/iosinst.cxx
@@ -413,49 +413,53 @@ void touch_lo_render_windows(void *context, int minX, int minY, int width, int h
extern "C"
void touch_lo_tap(int x, int y)
{
- SalFrame *pFocus = IosSalInstance::getInstance()->getFocusFrame();
- if (pFocus) {
- MouseEvent aEvent;
- sal_uLong nEvent;
-
- aEvent = MouseEvent(Point(x, y), 1, MOUSE_SIMPLECLICK, MOUSE_LEFT);
- nEvent = VCLEVENT_WINDOW_MOUSEBUTTONDOWN;
- Application::PostMouseEvent(nEvent, pFocus->GetWindow(), &aEvent);
-
- nEvent = VCLEVENT_WINDOW_MOUSEBUTTONUP;
- Application::PostMouseEvent(nEvent, pFocus->GetWindow(), &aEvent);
- }
+ touch_lo_mouse(x, y, DOWN, NONE);
+ touch_lo_mouse(x, y, UP, NONE);
}
extern "C"
-void touch_lo_mouse_drag(int x, int y, MLOMouseButtonState state)
+void touch_lo_mouse(int x, int y, MLOMouseButtonState state, MLOModifierMask modifiers)
{
SalFrame *pFocus = IosSalInstance::getInstance()->getFocusFrame();
if (pFocus) {
MouseEvent aEvent;
sal_uLong nEvent;
+ sal_uInt16 nModifiers = 0;
+
+ if (modifiers & SHIFT)
+ nModifiers |= KEY_SHIFT;
+
+ if (modifiers & META)
+ nModifiers |= KEY_MOD1;
- switch(state) {
+ switch (state) {
case DOWN:
- aEvent = MouseEvent(Point(x, y), 1, MOUSE_SIMPLECLICK, MOUSE_LEFT);
+ aEvent = MouseEvent(Point(x, y), 1, MOUSE_SIMPLECLICK, MOUSE_LEFT, nModifiers);
nEvent = VCLEVENT_WINDOW_MOUSEBUTTONDOWN;
break;
case MOVE:
- aEvent = MouseEvent(Point(x, y), 1, MOUSE_SIMPLEMOVE, MOUSE_LEFT);
+ aEvent = MouseEvent(Point(x, y), 1, MOUSE_SIMPLEMOVE, MOUSE_LEFT, nModifiers);
nEvent = VCLEVENT_WINDOW_MOUSEMOVE;
break;
case UP:
- aEvent = MouseEvent(Point(x, y), 1, MOUSE_SIMPLECLICK, MOUSE_LEFT);
+ aEvent = MouseEvent(Point(x, y), 1, MOUSE_SIMPLECLICK, MOUSE_LEFT, nModifiers);
nEvent = VCLEVENT_WINDOW_MOUSEBUTTONUP;
break;
+ default:
+ assert(false);
}
-
Application::PostMouseEvent(nEvent, pFocus->GetWindow(), &aEvent);
}
}
extern "C"
+void touch_lo_mouse_drag(int x, int y, MLOMouseButtonState state)
+{
+ touch_lo_mouse(x, y, state, NONE);
+}
+
+extern "C"
void touch_lo_pan(int deltaX, int deltaY)
{
SalFrame *pFocus = IosSalInstance::getInstance()->getFocusFrame();