Kaydet (Commit) 5930a963 authored tarafından Tor Lillqvist's avatar Tor Lillqvist

Implement the VCLEVENT_WINDOW_ZOOM by turning it into a wheel mouse event

For now just use an ad-hoc factor that works close enough on my device to turn
the zoom scale factor into a value for the somewhat undocumented mnDelta field
in SalWheelMouseEvent. Ideally we should of course calculate it so that the
end result actually is the document content view being scaled by the requested
scale factor.

Change-Id: I21215d38c8ce4a35591d92d305ad1aeeca379f0a
üst 92c033df
...@@ -98,7 +98,9 @@ class FontSelectPattern; ...@@ -98,7 +98,9 @@ class FontSelectPattern;
#define SALEVENT_SURROUNDINGTEXTREQUEST ((sal_uInt16)43) #define SALEVENT_SURROUNDINGTEXTREQUEST ((sal_uInt16)43)
#define SALEVENT_SURROUNDINGTEXTSELECTIONCHANGE ((sal_uInt16)44) #define SALEVENT_SURROUNDINGTEXTSELECTIONCHANGE ((sal_uInt16)44)
#define SALEVENT_STARTRECONVERSION ((sal_uInt16)45) #define SALEVENT_STARTRECONVERSION ((sal_uInt16)45)
#define SALEVENT_COUNT ((sal_uInt16)45) #define SALEVENT_EXTERNALZOOM ((sal_uInt16)46)
#define SALEVENT_EXTERNALSCROLL ((sal_uInt16)47)
#define SALEVENT_COUNT ((sal_uInt16)47)
// MOUSELEAVE must send, when the pointer leave the client area and // MOUSELEAVE must send, when the pointer leave the client area and
// the mouse is not captured // the mouse is not captured
......
...@@ -177,12 +177,17 @@ struct ImplPostEventData ...@@ -177,12 +177,17 @@ struct ImplPostEventData
sal_uLong mnEventId; sal_uLong mnEventId;
KeyEvent maKeyEvent; KeyEvent maKeyEvent;
MouseEvent maMouseEvent; MouseEvent maMouseEvent;
ZoomEvent maZoomEvent;
ScrollEvent maScrollEvent;
ImplPostEventData( sal_uLong nEvent, const Window* pWin, const KeyEvent& rKeyEvent ) : ImplPostEventData( sal_uLong nEvent, const Window* pWin, const KeyEvent& rKeyEvent ) :
mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maKeyEvent( rKeyEvent ) {} mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maKeyEvent( rKeyEvent ) {}
ImplPostEventData( sal_uLong nEvent, const Window* pWin, const MouseEvent& rMouseEvent ) : ImplPostEventData( sal_uLong nEvent, const Window* pWin, const MouseEvent& rMouseEvent ) :
mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maMouseEvent( rMouseEvent ) {} mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maMouseEvent( rMouseEvent ) {}
ImplPostEventData( sal_uLong nEvent, const Window* pWin, const ZoomEvent& rZoomEvent ) :
mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maZoomEvent( rZoomEvent ) {}
ImplPostEventData( sal_uLong nEvent, const Window* pWin, const ScrollEvent& rScrollEvent ) :
mnEvent( nEvent ), mpWin( pWin ), mnEventId( 0 ), maScrollEvent( rScrollEvent ) {}
~ImplPostEventData() {} ~ImplPostEventData() {}
}; };
...@@ -894,8 +899,26 @@ sal_uLong Application::PostZoomEvent( sal_uLong nEvent, Window *pWin, ZoomEvent* ...@@ -894,8 +899,26 @@ sal_uLong Application::PostZoomEvent( sal_uLong nEvent, Window *pWin, ZoomEvent*
if( pWin && pZoomEvent ) if( pWin && pZoomEvent )
{ {
// Implement... Point aTransformedPos( pZoomEvent->GetCenter() );
(void) nEvent;
aTransformedPos.X() += pWin->mnOutOffX;
aTransformedPos.Y() += pWin->mnOutOffY;
const ZoomEvent aTransformedEvent( aTransformedPos, pZoomEvent->GetScale() );
ImplPostEventData* pPostEventData = new ImplPostEventData( nEvent, pWin, aTransformedEvent );
PostUserEvent( nEventId,
STATIC_LINK( NULL, Application, PostEventHandler ),
pPostEventData );
if( nEventId )
{
pPostEventData->mnEventId = nEventId;
aPostedEventList.push_back( ImplPostEventPair( pWin, pPostEventData ) );
}
else
delete pPostEventData;
} }
return nEventId; return nEventId;
...@@ -938,6 +961,16 @@ IMPL_STATIC_LINK_NOINSTANCE( Application, PostEventHandler, void*, pCallData ) ...@@ -938,6 +961,16 @@ IMPL_STATIC_LINK_NOINSTANCE( Application, PostEventHandler, void*, pCallData )
pEventData = &pData->maKeyEvent; pEventData = &pData->maKeyEvent;
break; break;
case VCLEVENT_WINDOW_ZOOM:
nEvent = SALEVENT_EXTERNALZOOM;
pEventData = &pData->maZoomEvent;
break;
case VCLEVENT_WINDOW_SCROLL:
nEvent = SALEVENT_EXTERNALSCROLL;
pEventData = &pData->maScrollEvent;
break;
default: default:
nEvent = 0; nEvent = 0;
pEventData = NULL; pEventData = NULL;
......
...@@ -2592,6 +2592,37 @@ long ImplWindowFrameProc( Window* pWindow, SalFrame* /*pFrame*/, ...@@ -2592,6 +2592,37 @@ long ImplWindowFrameProc( Window* pWindow, SalFrame* /*pFrame*/,
case SALEVENT_STARTRECONVERSION: case SALEVENT_STARTRECONVERSION:
ImplHandleStartReconversion( pWindow ); ImplHandleStartReconversion( pWindow );
break; break;
case SALEVENT_EXTERNALZOOM:
{
// Manually tuned to get a pleasing effect at least on my
// device... Would be better to actually achieve the
// requested scale factor of course.
const int ZOOM_FACTOR = 300;
ZoomEvent* pZoomEvent = (ZoomEvent*) pEvent;
SalWheelMouseEvent aSalWheelMouseEvent;
aSalWheelMouseEvent.mnTime = Time::GetSystemTicks();
aSalWheelMouseEvent.mnX = pZoomEvent->GetCenter().getX();
aSalWheelMouseEvent.mnY = pZoomEvent->GetCenter().getY();
if ( pZoomEvent->GetScale() < 1 ) {
aSalWheelMouseEvent.mnDelta = - (long) ((1 - pZoomEvent->GetScale()) * ZOOM_FACTOR);
aSalWheelMouseEvent.mnNotchDelta = -1;
} else {
aSalWheelMouseEvent.mnDelta = (long) ((pZoomEvent->GetScale() - 1) * ZOOM_FACTOR);
aSalWheelMouseEvent.mnNotchDelta = 1;
}
aSalWheelMouseEvent.mnScrollLines = 1; // ???
aSalWheelMouseEvent.mnCode = KEY_MOD1;
aSalWheelMouseEvent.mbDeltaIsPixel = 0; // ???
nRet = ImplHandleWheelEvent( pWindow, aSalWheelMouseEvent );
}
break;
case SALEVENT_EXTERNALSCROLL:
break;
#ifdef DBG_UTIL #ifdef DBG_UTIL
default: default:
OSL_TRACE( "ImplWindowFrameProc(): unknown event (%lu)", (sal_uLong)nEvent ); OSL_TRACE( "ImplWindowFrameProc(): unknown event (%lu)", (sal_uLong)nEvent );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment