xref: /aoo41x/main/soldep/source/connctr.cxx (revision d9e04f7d)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifdef _MSC_VER
24 #pragma warning(disable:4100)
25 #endif
26 #include <soldep/connctr.hxx>
27 #include <soldep/objwin.hxx>
28 #include <soldep/depwin.hxx>
29 #include "math.h"
30 
31 sal_Bool Connector::msbHideMode = sal_False;
32 
Connector(DepWin * pParent,WinBits nWinStyle)33 Connector::Connector( DepWin* pParent, WinBits nWinStyle ) :
34 mpStartWin( 0L ),
35 mpEndWin( 0L ),
36 mnStartId( 0 ),
37 mnEndId( 0 ),
38 bVisible( sal_False ),
39 len( 70 )
40 {
41 	mpParent = pParent;
42 	if ( mpParent )
43 		mpParent->AddConnector( this );
44 }
45 
~Connector()46 Connector::~Connector()
47 {
48 	if ( mpStartWin )
49 		mpStartWin->RemoveConnector( this );
50 	if ( mpEndWin )
51 		mpEndWin->RemoveConnector( this );
52 	if ( mpParent )
53 		mpParent->RemoveConnector( this );
54 	mpParent->Invalidate( Rectangle( mStart, mEnd ));
55 	mpParent->Invalidate( Rectangle( mEnd - Point( 3, 3), mEnd + Point( 3, 3)));
56 }
57 
Initialize(ObjectWin * pStartWin,ObjectWin * pEndWin,sal_Bool bVis)58 void Connector::Initialize( ObjectWin* pStartWin, ObjectWin* pEndWin, sal_Bool bVis )
59 {
60 	mpStartWin = pStartWin;
61 	mpEndWin = pEndWin;
62 	mpStartWin->AddConnector( this );
63 	mpEndWin->AddConnector( this );
64 	mCenter = GetMiddle();
65 	mStart = pStartWin->GetFixPoint( mCenter );
66 	mEnd = pEndWin->GetFixPoint( mCenter );
67 	mnStartId = pStartWin->GetId();
68 	mnEndId = pEndWin->GetId();
69     bVisible = bVis;
70 
71 //	if ( mpParent->IsPaintEnabled())
72     if ( IsVisible() )
73 	{
74 		mpParent->DrawLine( mEnd, mStart );
75 		mpParent->DrawEllipse( Rectangle( mEnd - Point( 2, 2), mEnd + Point( 2, 2)));
76 	}
77 	UpdateVisibility(); //null_Project
78 }
79 
UpdateVisibility()80 void Connector::UpdateVisibility()
81 {
82 	bVisible = mpStartWin->IsVisible() && mpEndWin->IsVisible();
83 }
84 
85 
GetMiddle()86 Point Connector::GetMiddle()
87 {
88 	Point aStartPoint = mpStartWin->GetPosPixel();
89 	Size aStartSize = mpStartWin->GetSizePixel();
90 	int nMoveHorz, nMoveVert;
91 	aStartPoint.Move( aStartSize.Width() / 2, aStartSize.Height() / 2 );
92 
93 	Point aEndPoint = mpEndWin->GetPosPixel();
94 	Size aEndSize = mpEndWin->GetSizePixel();
95 
96 	aEndPoint.Move( aEndSize.Width() / 2, aEndSize.Height() / 2 );
97 
98 	Point aRetPoint = aEndPoint;
99 
100 	nMoveHorz = aStartPoint.X() - aEndPoint.X();
101 	if ( nMoveHorz )
102 		nMoveHorz /= 2;
103 	nMoveVert = aStartPoint.Y() - aEndPoint.Y();
104 	if ( nMoveVert )
105 		nMoveVert /= 2;
106 	aRetPoint.Move( nMoveHorz, nMoveVert );
107 	return aRetPoint;
108 
109 }
110 
Paint(const Rectangle & rRect)111 void Connector::Paint( const Rectangle& rRect )
112 {
113     //MyApp *pApp = (MyApp*)GetpApp();
114     //SolDep *pSoldep = pApp->GetSolDep();
115     if (msbHideMode)
116     {
117     if (!(mpStartWin->IsNullObject())) //null_project
118     {
119         if ( mpStartWin->GetMarkMode() == 0 || mpStartWin->GetMarkMode() == MARKMODE_DEPENDING )
120         {
121             mpStartWin->SetViewMask(0); //objwin invisible
122         } else
123         {
124             mpStartWin->SetViewMask(1); //objwin visible
125         }
126     }
127     if (!(mpEndWin->IsNullObject()))
128     {
129         if ( mpEndWin->GetMarkMode() == 0 || mpEndWin->GetMarkMode() == MARKMODE_DEPENDING )
130         {
131             mpEndWin->SetViewMask(0); //objwin invisible
132         } else
133         {
134             mpEndWin->SetViewMask(1); //objwin visible
135         }
136     }
137     UpdateVisibility();
138     } else //IsHideMode
139     {
140         //bVisible = sal_True;
141         if (!(mpStartWin->IsNullObject())) //null_project
142         {
143              mpStartWin->SetViewMask(1);
144         }
145         if (!(mpEndWin->IsNullObject())) //null_project
146         {
147              mpEndWin->SetViewMask(1);
148         }
149         UpdateVisibility();
150     }
151     if ( (mpStartWin->GetBodyText() != ByteString("null")) &&              //null_project
152          (mpEndWin->GetBodyText() != ByteString("null")) && IsVisible())  //null_project
153     {
154 		mpParent->DrawLine( mEnd, mStart );
155 		mpParent->DrawEllipse( Rectangle( mEnd - Point( 2, 2), mEnd + Point( 2, 2)));
156 	}
157 }
158 
DrawOutput(OutputDevice * pDevice,const Point & rOffset)159 void Connector::DrawOutput( OutputDevice* pDevice, const Point& rOffset )
160 {
161     if ( (mpStartWin->GetBodyText() != ByteString("null")) &&              //null_project
162          (mpEndWin->GetBodyText() != ByteString("null")) && IsVisible())  //null_project
163     {
164 		pDevice->DrawLine( pDevice->PixelToLogic( mEnd ) - rOffset, pDevice->PixelToLogic( mStart ) - rOffset );
165 		Rectangle aRect( pDevice->PixelToLogic( Rectangle( mEnd - Point( 2, 2), mEnd + Point( 2, 2) ) ) );
166 		aRect.Move( -rOffset.X(), -rOffset.Y() );
167 		pDevice->DrawEllipse( aRect );
168 	}
169 }
170 
UpdatePosition(ObjectWin * pWin,sal_Bool bPaint)171 void Connector::UpdatePosition( ObjectWin* pWin, sal_Bool bPaint )
172 {
173 //	more than one call ?
174 //
175 	Point OldStart, OldEnd;
176 	static sal_uIntPtr nCallCount = 0;
177 
178     //MyApp *pApp = (MyApp*)GetpApp();
179     //SolDep *pSoldep = pApp->GetSolDep();
180     if (msbHideMode)
181 	    bVisible = 1;
182 
183 	if ( nCallCount )           // only one call
184 		nCallCount++;
185 	else
186 	{
187 		nCallCount++;
188 		while ( nCallCount )
189 		{
190 			if ( bPaint )
191 			{
192 				OldStart = mStart;
193 				OldEnd = mEnd;
194 			}
195 			mCenter = GetMiddle();
196 			mStart=mpStartWin->GetFixPoint( mCenter, bPaint );
197 			mEnd=mpEndWin->GetFixPoint( mCenter, bPaint );
198 			if ( bPaint )
199 			{
200 				mpParent->Invalidate( Rectangle( OldStart, OldEnd ));
201 				mpParent->Invalidate( Rectangle( OldEnd - Point( 2, 2), OldEnd + Point( 2, 2)));
202 //Don't paint "null_project" connectors
203                 if ( (mpStartWin->GetBodyText() != ByteString("null")) &&    			//null_project
204                      (mpEndWin->GetBodyText() != ByteString("null")))        			//null_project
205                 {
206 				    Paint ( Rectangle( mEnd - Point( 3, 3), mEnd + Point( 3, 3)));
207 				    Paint ( Rectangle( mEnd, mStart ));
208                 }
209 			}
210 			nCallCount--;
211 		}
212 	}
213 }
214 
Save(SvFileStream & rOutFile)215 sal_uInt16 Connector::Save( SvFileStream& rOutFile )
216 {
217 	rOutFile << mpStartWin->GetId();
218 	rOutFile << mpEndWin->GetId();
219 
220 	return 0;
221 }
222 
Load(SvFileStream & rInFile)223 sal_uInt16 Connector::Load( SvFileStream& rInFile )
224 {
225 	rInFile >> mnStartId;
226 	rInFile >> mnEndId;
227 
228 	return 0;
229 }
230 
GetOtherWin(ObjectWin * pWin)231 ObjectWin* Connector::GetOtherWin( ObjectWin* pWin )
232 {
233 // get correspondent object ptr
234 	if ( mpStartWin == pWin )
235 		return mpEndWin;
236 	else
237 		if ( mpEndWin == pWin )
238 			return mpStartWin;
239 
240 	return NULL;
241 }
242 
GetOtherId(sal_uIntPtr nId)243 sal_uIntPtr Connector::GetOtherId( sal_uIntPtr nId )
244 {
245 // get correspondent object id
246 	if ( mnStartId == nId )
247 		return mnEndId;
248 	else
249 		if ( mnEndId == nId )
250 			return mnStartId;
251 
252 	return NULL;
253 }
254 
GetLen()255 sal_uIntPtr Connector::GetLen()
256 {
257 	double dx, dy;
258 
259 	dx = mStart.X() - mEnd.X();
260 	dy = mStart.Y() - mEnd.Y();
261 
262 	return (sal_uIntPtr) sqrt( dx * dx + dy * dy );
263 }
264 
IsStart(ObjectWin * pWin)265 sal_Bool Connector::IsStart( ObjectWin* pWin )
266 {
267 	return pWin == mpStartWin;
268 }
269