| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_vcl.hxx" |
| |
| #include <string.h> |
| |
| #include "aqua/saldata.hxx" |
| #include "aqua/salobj.h" |
| #include "aqua/salframe.h" |
| |
| // ======================================================================= |
| |
| AquaSalObject::AquaSalObject( AquaSalFrame* pFrame ) : |
| mpFrame( pFrame ), |
| mnClipX( -1 ), |
| mnClipY( -1 ), |
| mnClipWidth( -1 ), |
| mnClipHeight( -1 ), |
| mbClip( false ), |
| mnX( 0 ), |
| mnY( 0 ), |
| mnWidth( 20 ), |
| mnHeight( 20 ) |
| { |
| maSysData.nSize = sizeof( maSysData ); |
| maSysData.mpNSView = NULL; |
| |
| NSRect aInitFrame = { NSZeroPoint, { 20, 20 } }; |
| mpClipView = [[NSClipView alloc] initWithFrame: aInitFrame ]; |
| if( mpClipView ) |
| { |
| [mpFrame->getNSView() addSubview: mpClipView]; |
| [mpClipView setHidden: YES]; |
| } |
| maSysData.mpNSView = [[NSView alloc] initWithFrame: aInitFrame]; |
| if( maSysData.mpNSView ) |
| { |
| if( mpClipView ) |
| [mpClipView setDocumentView: maSysData.mpNSView]; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| AquaSalObject::~AquaSalObject() |
| { |
| if( maSysData.mpNSView ) |
| { |
| NSView *pView = maSysData.mpNSView; |
| [pView removeFromSuperview]; |
| [pView release]; |
| } |
| if( mpClipView ) |
| { |
| [mpClipView removeFromSuperview]; |
| [mpClipView release]; |
| } |
| } |
| |
| /* |
| sadly there seems to be no way to impose clipping on a child view, |
| especially a QTMovieView which seems to ignore the current context |
| completely. Also there is no real way to shape a window; on Aqua a |
| similar effect to non-rectangular windows is achieved by using a |
| non-opaque window and not painting where one wants the background |
| to shine through. |
| |
| With respect to SalObject this leaves us to having an NSClipView |
| containing the child view. Even a QTMovieView respects the boundaries of |
| that, which gives us a clip "region" consisting of one rectangle. |
| This is gives us an 80% solution only, though. |
| */ |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::ResetClipRegion() |
| { |
| mbClip = false; |
| setClippedPosSize(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| sal_uInt16 AquaSalObject::GetClipRegionType() |
| { |
| return SAL_OBJECT_CLIP_INCLUDERECTS; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::BeginSetClipRegion( sal_uLong ) |
| { |
| mbClip = false; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::UnionClipRegion( long nX, long nY, long nWidth, long nHeight ) |
| { |
| if( mbClip ) |
| { |
| if( nX < mnClipX ) |
| { |
| mnClipWidth += mnClipX - nX; |
| mnClipX = nX; |
| } |
| if( nX + nWidth > mnClipX + mnClipWidth ) |
| mnClipWidth = nX + nWidth - mnClipX; |
| if( nY < mnClipY ) |
| { |
| mnClipHeight += mnClipY - nY; |
| mnClipY = nY; |
| } |
| if( nY + nHeight > mnClipY + mnClipHeight ) |
| mnClipHeight = nY + nHeight - mnClipY; |
| } |
| else |
| { |
| mnClipX = nX; |
| mnClipY = nY; |
| mnClipWidth = nWidth; |
| mnClipHeight = nHeight; |
| mbClip = true; |
| } |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::EndSetClipRegion() |
| { |
| setClippedPosSize(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::SetPosSize( long nX, long nY, long nWidth, long nHeight ) |
| { |
| mnX = nX; |
| mnY = nY; |
| mnWidth = nWidth; |
| mnHeight = nHeight; |
| setClippedPosSize(); |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::setClippedPosSize() |
| { |
| NSRect aViewRect = { NSZeroPoint, NSMakeSize( mnWidth, mnHeight) }; |
| if( maSysData.mpNSView ) |
| { |
| NSView* pNSView = maSysData.mpNSView; |
| [pNSView setFrame: aViewRect]; |
| } |
| |
| NSRect aClipViewRect = NSMakeRect( mnX, mnY, mnWidth, mnHeight); |
| NSPoint aClipPt = NSZeroPoint; |
| if( mbClip ) |
| { |
| aClipViewRect.origin.x += mnClipX; |
| aClipViewRect.origin.y += mnClipY; |
| aClipViewRect.size.width = mnClipWidth; |
| aClipViewRect.size.height = mnClipHeight; |
| aClipPt.x = mnClipX; |
| if( mnClipY == 0 ) |
| aClipPt.y = mnHeight - mnClipHeight;; |
| } |
| |
| mpFrame->VCLToCocoa( aClipViewRect, false ); |
| [mpClipView setFrame: aClipViewRect]; |
| |
| [mpClipView scrollToPoint: aClipPt]; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::Show( sal_Bool bVisible ) |
| { |
| if( mpClipView ) |
| [mpClipView setHidden: (bVisible ? NO : YES)]; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::Enable( sal_Bool ) |
| { |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::GrabFocus() |
| { |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::SetBackground() |
| { |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::SetBackground( SalColor ) |
| { |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| const SystemEnvData* AquaSalObject::GetSystemData() const |
| { |
| return &maSysData; |
| } |
| |
| // ----------------------------------------------------------------------- |
| |
| void AquaSalObject::InterceptChildWindowKeyDown( sal_Bool /*bIntercept*/ ) |
| { |
| } |
| |