1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svl.hxx"
30 #include <svl/pickerhistory.hxx>
31 #include <svl/pickerhistoryaccess.hxx>
32 #include <cppuhelper/weakref.hxx>
33 #include <vector>
34 
35 //.........................................................................
36 namespace svt
37 {
38 //.........................................................................
39 	using namespace ::com::sun::star::uno;
40 
41 	namespace
42 	{
43 		typedef ::com::sun::star::uno::WeakReference< XInterface >	InterfaceAdapter;
44 		typedef ::std::vector< InterfaceAdapter  >					InterfaceArray;
45 
46 		// ----------------------------------------------------------------
47 		InterfaceArray& getFolderPickerHistory()
48 		{
49 			static InterfaceArray s_aHistory;
50 			return s_aHistory;
51 		}
52 
53 		// ----------------------------------------------------------------
54 		InterfaceArray& getFilePickerHistory()
55 		{
56 			static InterfaceArray s_aHistory;
57 			return s_aHistory;
58 		}
59 
60 		// ----------------------------------------------------------------
61 		void implPushBackPicker( InterfaceArray& _rHistory, const Reference< XInterface >& _rxPicker )
62 		{
63 			if ( !_rxPicker.is() )
64 				return;
65 
66             //=============================================================
67 			// first, check which of the objects we hold in s_aHistory can be removed
68 			{
69 				InterfaceArray aCleanedHistory;
70 				for	(	InterfaceArray::const_iterator aLoop = _rHistory.begin();
71 						aLoop != _rHistory.end();
72 						++aLoop
73 					)
74 				{
75 					Reference< XInterface > xCurrent( aLoop->get() );
76 					if ( xCurrent.is() )
77 					{
78 						if ( aCleanedHistory.empty() )
79 							// make some room, assume that all interfaces (from here on) are valie
80 							aCleanedHistory.reserve( _rHistory.size() - ( aLoop - _rHistory.begin() ) );
81 						aCleanedHistory.push_back( InterfaceAdapter( xCurrent ) );
82 					}
83 				}
84 				_rHistory.swap( aCleanedHistory );
85 			}
86 
87             //=============================================================
88 			// then push_back the picker
89 			_rHistory.push_back( InterfaceAdapter( _rxPicker ) );
90 		}
91 
92 		//-----------------------------------------------------------------
93 		Reference< XInterface > implGetTopMostPicker( const InterfaceArray& _rHistory )
94 		{
95 			Reference< XInterface > xTopMostAlive;
96 
97             //=============================================================
98 			// search the first picker which is still alive ...
99 			for	(	InterfaceArray::const_reverse_iterator aLoop = _rHistory.rbegin();
100 					( aLoop != _rHistory.rend() ) && !xTopMostAlive.is();
101 					++aLoop
102 				)
103 			{
104 				xTopMostAlive = aLoop->get();
105 			}
106 
107 			return xTopMostAlive;
108 		}
109 	}
110 
111 	//---------------------------------------------------------------------
112 	Reference< XInterface > GetTopMostFolderPicker( )
113 	{
114 		return implGetTopMostPicker( getFolderPickerHistory() );
115 	}
116 
117 	//---------------------------------------------------------------------
118 	Reference< XInterface > GetTopMostFilePicker( )
119 	{
120 		return implGetTopMostPicker( getFilePickerHistory() );
121 	}
122 
123 	//---------------------------------------------------------------------
124 	void addFolderPicker( const Reference< XInterface >& _rxPicker )
125 	{
126 		implPushBackPicker( getFolderPickerHistory(), _rxPicker );
127 	}
128 
129 	//---------------------------------------------------------------------
130 	void addFilePicker( const Reference< XInterface >& _rxPicker )
131 	{
132 		implPushBackPicker( getFilePickerHistory(), _rxPicker );
133 	}
134 
135 //.........................................................................
136 }	// namespace svt
137 //.........................................................................
138 
139