/*! ******************************************************************************
*
* Pentaho Data Integration
*
* Copyright (C) 2002-2017 by Pentaho : http://www.pentaho.com
*
*******************************************************************************
*
* Licensed 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.
*
******************************************************************************/
package org.pentaho.di.ui.repo;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.pentaho.di.core.exception.KettleException;
import org.pentaho.di.core.logging.KettleLogStore;
import org.pentaho.di.core.logging.LogChannelInterface;
import org.pentaho.di.i18n.BaseMessages;
import org.pentaho.di.repository.RepositoriesMeta;
import org.pentaho.di.repository.RepositoryMeta;
import org.pentaho.di.ui.spoon.Spoon;
public class RepositoryConnectMenu {
private static Class<?> PKG = RepositoryConnectMenu.class;
private static LogChannelInterface log = KettleLogStore.getLogChannelInterfaceFactory().create(
RepositoryConnectMenu.class );
private static final int MAX_REPO_NAME_PIXEL_LENGTH = 230;
private Spoon spoon;
private ToolBar toolBar;
private ToolItem connectButton;
private ToolItem connectDropdown;
private RepositoriesMeta repositoriesMeta;
private final RepositoryConnectController repoConnectController;
public RepositoryConnectMenu( Spoon spoon, ToolBar toolBar, RepositoryConnectController repoConnectController ) {
this.toolBar = toolBar;
this.spoon = spoon;
this.repoConnectController = repoConnectController;
repoConnectController.addListener( new RepositoryConnectController.RepositoryContollerListener() {
@Override
public void update() {
renderAndUpdate();
}
} );
}
public void update() {
Rectangle rect = toolBar.getBounds();
if ( connectDropdown != null && !connectDropdown.isDisposed() ) {
if ( spoon.rep != null ) {
StringBuilder connectionLabel = new StringBuilder();
if ( spoon.rep.getUserInfo() != null ) {
connectionLabel.append( spoon.rep.getUserInfo().getLogin() );
connectionLabel.append( " | " );
}
StringBuilder connectionLabelTip = new StringBuilder( connectionLabel.toString() );
if ( repoConnectController != null && repoConnectController.getConnectedRepository() != null ) {
connectionLabel.append( truncateName( repoConnectController.getConnectedRepository().getName() ) );
connectionLabelTip.append( repoConnectController.getConnectedRepository().getName() );
}
connectDropdown.setText( connectionLabel.toString() );
connectDropdown.setToolTipText( connectionLabelTip.toString() );
} else {
connectDropdown.setText( BaseMessages.getString( PKG, "RepositoryConnectMenu.Connect" ) );
}
}
// This fixes some SWT goofiness
toolBar.pack();
toolBar.setBounds( rect );
}
public void render() {
repositoriesMeta = new RepositoriesMeta();
try {
if ( repositoriesMeta.readData() && repositoriesMeta.nrRepositories() > 0 ) {
renderConnectDropdown();
} else {
renderConnectButton();
}
} catch ( KettleException e ) {
log.logError( BaseMessages.getString( "RepositoryConnectMenu.ErrorLoadingRepositories" ), e );
}
}
private void renderAndUpdate() {
if ( connectDropdown != null && !connectDropdown.isDisposed() ) {
connectDropdown.dispose();
}
if ( connectButton != null && !connectButton.isDisposed() ) {
connectButton.dispose();
}
render();
update();
}
private void renderConnectButton() {
connectButton = new ToolItem( toolBar, toolBar.getItems().length );
connectButton.setText( BaseMessages.getString( PKG, "RepositoryConnectMenu.Connect" ) );
connectButton.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent selectionEvent ) {
new RepositoryDialog( spoon.getShell(), repoConnectController ).openCreation();
renderAndUpdate();
}
} );
}
private void renderConnectDropdown() {
connectDropdown = new ToolItem( toolBar, SWT.DROP_DOWN, toolBar.getItems().length );
connectDropdown.setText( BaseMessages.getString( PKG, "RepositoryConnectMenu.Connect" ) );
connectDropdown.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent event ) {
final Menu connectionMenu = new Menu( toolBar.getShell() );
if ( repositoriesMeta != null ) {
for ( int i = 0; i < repositoriesMeta.nrRepositories(); i++ ) {
MenuItem item = new MenuItem( connectionMenu, SWT.CHECK );
String truncatedName = truncateName( repositoriesMeta.getRepository( i ).getName() );
item.setText( truncatedName );
item.setData( repositoriesMeta.getRepository( i ).getName() );
if ( spoon.rep != null && spoon.rep.getName().equals( repositoriesMeta.getRepository( i ).getName() ) ) {
item.setSelection( true );
continue;
}
item.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent selectionEvent ) {
String repoName = (String) ( selectionEvent.widget ).getData();
RepositoryMeta repositoryMeta = repositoriesMeta.findRepository( repoName );
if ( repositoryMeta != null ) {
try {
if ( !spoon.promptForSave() ) {
return;
}
} catch ( KettleException ke ) {
log.logError( "Error prompting for save", ke );
}
if ( repositoryMeta.getId().equals( "KettleFileRepository" ) ) {
try {
repoConnectController.connectToRepository( repositoryMeta );
} catch ( KettleException ke ) {
log.logError( "Error connecting to repository", ke );
}
} else {
new RepositoryDialog( spoon.getShell(), repoConnectController ).openLogin( repositoryMeta );
}
renderAndUpdate();
}
}
} );
}
}
new MenuItem( connectionMenu, SWT.SEPARATOR );
MenuItem managerItem = new MenuItem( connectionMenu, SWT.NONE );
managerItem.setText( BaseMessages.getString( PKG, "RepositoryConnectMenu.RepositoryManager" ) );
managerItem.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent selectionEvent ) {
new RepositoryDialog( spoon.getShell(), repoConnectController ).openManager();
renderAndUpdate();
}
} );
new MenuItem( connectionMenu, SWT.SEPARATOR );
MenuItem disconnectItem = new MenuItem( connectionMenu, SWT.NONE );
disconnectItem.setEnabled( spoon.rep != null );
disconnectItem.setText( BaseMessages.getString( PKG, "RepositoryConnectMenu.Disconnect" ) );
disconnectItem.addSelectionListener( new SelectionAdapter() {
@Override
public void widgetSelected( SelectionEvent selectionEvent ) {
spoon.closeRepository();
repoConnectController.setConnectedRepository( null );
renderAndUpdate();
}
} );
ToolItem item = (ToolItem) event.widget;
Rectangle rect = item.getBounds();
org.eclipse.swt.graphics.Point pt =
item.getParent().toDisplay( new org.eclipse.swt.graphics.Point( rect.x, rect.y + rect.height ) );
connectionMenu.setLocation( pt.x, pt.y );
connectionMenu.setVisible( true );
}
} );
}
private String truncateName( String name ) {
GC gc = new GC( toolBar );
Point size = gc.textExtent( name );
if ( size.x <= MAX_REPO_NAME_PIXEL_LENGTH ) { // repository name is small enough to fit just return it.
gc.dispose();
return name;
}
String originalName = name;
while ( gc.textExtent( name + "..." ).x > MAX_REPO_NAME_PIXEL_LENGTH ) {
name = name.substring( 0, name.length() - 1 );
}
gc.dispose();
name = name + "...";
return name;
}
}