/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/


#ifndef DBAUI_QUERYVIEWSWITCH_HXX
#define DBAUI_QUERYVIEWSWITCH_HXX

#include "queryview.hxx"

namespace dbtools
{
    class SQLExceptionInfo;
}

namespace dbaui
{
	class OQueryDesignView;
	class OQueryTextView;
	class OAddTableDlg;
	class OQueryContainerWindow;
	class OQueryViewSwitch 
	{
		OQueryDesignView*	m_pDesignView;
		OQueryTextView*		m_pTextView;
		sal_Bool			m_bAddTableDialogWasVisible; // true if so
	public:
		OQueryViewSwitch(OQueryContainerWindow* pParent, OQueryController& _rController,const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& );
		virtual ~OQueryViewSwitch();

		virtual sal_Bool isCutAllowed();
		virtual sal_Bool isPasteAllowed();
		virtual sal_Bool isCopyAllowed();
		virtual void copy();
		virtual void cut();
		virtual void paste();
		// clears the whole query
		virtual void clear();
		// set the view readonly or not
		virtual void setReadOnly(sal_Bool _bReadOnly);
		// check if the statement is correct when not returning false
		virtual sal_Bool checkStatement();
		// set the statement for representation
		virtual void setStatement(const ::rtl::OUString& _rsStatement);
		// returns the current sql statement
		virtual ::rtl::OUString getStatement();
		/// late construction
		virtual void Construct();
		virtual void initialize();
		/** show the text or the design view
			@return
				<TRUE/> if and only if the view could be successfully, switched, <FALSE/> otherwise
                (In the latter case, the controller will issue another switchView call to restore the
                old state)
		*/
		bool     switchView( ::dbtools::SQLExceptionInfo* _pErrorInfo );
        void     forceInitialView();
		sal_Bool isSlotEnabled(sal_Int32 _nSlotId);
		void	 setSlotEnabled(sal_Int32 _nSlotId,sal_Bool _bEnable);
		void	 setNoneVisbleRow(sal_Int32 _nRows);
		void     SaveUIConfig();
		bool     reset( ::dbtools::SQLExceptionInfo* _pErrorInfo );
		void     GrabFocus();

        // returs the add table dialog from the design view
		OAddTableDlg* getAddTableDialog();

		OQueryDesignView*		getDesignView() const { return m_pDesignView; }
		OQueryContainerWindow*	getContainer() const;

		void SetPosSizePixel( Point _rPt,Size _rSize);
		::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > getORB() const;
	protected:
		// return the Rectangle where I can paint myself
		virtual void resizeDocumentView(Rectangle& rRect);

    private:
        void    impl_forceSQLView();
        bool    impl_postViewSwitch( const bool i_bGraphicalDesign, const bool i_bSuccess );
	};
}
#endif // DBAUI_QUERYVIEWSWITCH_HXX

