/* * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2006 - 2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.engine.classic.core.designtime.datafactory.editor.model; import org.pentaho.reporting.libraries.base.util.ObjectUtilities; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; public class DefaultQueryDialogModel<T> implements QueryDialogModel<T> { private ArrayList<Query<T>> backend; private ArrayList<QueryDialogModelListener> listeners; private QueryDialogComboBoxModel<T> model; private int selectedIndex; private String globalScriptLanguage; private String globalScript; public DefaultQueryDialogModel() { backend = new ArrayList<Query<T>>(); listeners = new ArrayList<QueryDialogModelListener>(); model = new QueryDialogComboBoxModel<T>( this ); selectedIndex = -1; } public void addQuery( final Query<T> query ) { backend.add( query ); final QueryDialogModelEvent<T> event = new QueryDialogModelEvent<T>( this, backend.size() - 1, query, -1, null ); fireEvent( new Func<QueryDialogModelListener<T>>() { public void run( final QueryDialogModelListener<T> value ) { value.queryAdded( event ); } } ); } public QueryDialogComboBoxModel<T> getQueries() { return model; } public boolean isQuerySelected() { return selectedIndex != -1; } public void setSelectedQuery( final Query<T> query ) { int newIndex; if ( query != null ) { newIndex = backend.indexOf( query ); if ( newIndex == -1 ) { throw new IllegalStateException(); } } else { newIndex = -1; } if ( newIndex == selectedIndex ) { return; } Query<T> oldValue = getSelectedQuery(); int oldIndex = selectedIndex; selectedIndex = newIndex; final QueryDialogModelEvent<T> event = new QueryDialogModelEvent<T>( this, selectedIndex, query, oldIndex, oldValue ); fireEvent( new Func<QueryDialogModelListener<T>>() { public void run( final QueryDialogModelListener<T> value ) { value.selectionChanged( event ); } } ); } private void fireEvent( Func<QueryDialogModelListener<T>> delegate ) { // noinspection unchecked for ( QueryDialogModelListener<T> listener : listeners.toArray( new QueryDialogModelListener[listeners.size()] ) ) { delegate.run( listener ); } } public Query<T> getSelectedQuery() { if ( selectedIndex == -1 ) { return null; } return backend.get( selectedIndex ); } public void removeQuery( final Query<T> query ) { int index = backend.indexOf( query ); if ( index == -1 ) { return; } Query<T> oldValue = backend.remove( index ); if ( index == selectedIndex ) { selectedIndex = -1; final QueryDialogModelEvent<T> event = new QueryDialogModelEvent<T>( this, selectedIndex, null, index, oldValue ); fireEvent( new Func<QueryDialogModelListener<T>>() { public void run( final QueryDialogModelListener<T> value ) { value.selectionChanged( event ); } } ); } final QueryDialogModelEvent<T> event = new QueryDialogModelEvent<T>( this, -1, null, index, oldValue ); fireEvent( new Func<QueryDialogModelListener<T>>() { public void run( final QueryDialogModelListener<T> value ) { value.queryRemoved( event ); } } ); } public void updateQuery( final int index, final Query<T> query ) { Query<T> oldValue = backend.set( index, query ); if ( ObjectUtilities.equal( oldValue, query ) ) { return; } final QueryDialogModelEvent<T> event = new QueryDialogModelEvent<T>( this, index, query, index, oldValue ); fireEvent( new Func<QueryDialogModelListener<T>>() { public void run( final QueryDialogModelListener<T> value ) { value.queryUpdated( event ); } } ); } public void clear() { setSelectedQuery( null ); backend.clear(); final QueryDialogModelEvent<T> event = new QueryDialogModelEvent<T>( this ); fireEvent( new Func<QueryDialogModelListener<T>>() { public void run( final QueryDialogModelListener<T> value ) { value.queryDataChanged( event ); } } ); } public void updateSelectedQuery( final Query<T> newQuery ) { updateQuery( selectedIndex, newQuery ); } public int getQueryCount() { return backend.size(); } public Query<T> getQuery( final int index ) { if ( index >= backend.size() ) { throw new IndexOutOfBoundsException(); } return backend.get( index ); } public void setGlobalScripting( final String lang, final String script ) { if ( ObjectUtilities.equal( lang, globalScriptLanguage ) && ObjectUtilities.equal( script, globalScript ) ) { return; } this.globalScript = script; this.globalScriptLanguage = lang; final QueryDialogModelEvent<T> event = new QueryDialogModelEvent<T>( this ); fireEvent( new Func<QueryDialogModelListener<T>>() { public void run( final QueryDialogModelListener<T> value ) { value.globalScriptChanged( event ); } } ); } public String getGlobalScriptLanguage() { return globalScriptLanguage; } public String getGlobalScript() { return globalScript; } public void addQueryDialogModelListener( final QueryDialogModelListener<T> listener ) { listeners.add( listener ); } public void removeQueryDialogModelListener( final QueryDialogModelListener<T> listener ) { listeners.remove( listener ); } public Iterator<Query<T>> iterator() { return Collections.unmodifiableList( backend ).iterator(); } }