/**
* This file Copyright (c) 2005-2010 Aptana, Inc. This program is
* dual-licensed under both the Aptana Public License and the GNU General
* Public license. You may elect to use one or the other of these licenses.
*
* This program is distributed in the hope that it will be useful, but
* AS-IS and WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, TITLE, or
* NONINFRINGEMENT. Redistribution, except as permitted by whichever of
* the GPL or APL you select, is prohibited.
*
* 1. For the GPL license (GPL), you can redistribute and/or modify this
* program under the terms of the GNU General Public License,
* Version 3, as published by the Free Software Foundation. You should
* have received a copy of the GNU General Public License, Version 3 along
* with this program; if not, write to the Free Software Foundation, Inc., 51
* Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Aptana provides a special exception to allow redistribution of this file
* with certain Eclipse Public Licensed code and certain additional terms
* pursuant to Section 7 of the GPL. You may view the exception and these
* terms on the web at http://www.aptana.com/legal/gpl/.
*
* 2. For the Aptana Public License (APL), this program and the
* accompanying materials are made available under the terms of the APL
* v1.0 which accompanies this distribution, and is available at
* http://www.aptana.com/legal/apl/.
*
* You may view the GPL, Aptana's exception and additional terms, and the
* APL in the file titled license.html at the root of the corresponding
* plugin containing this source file.
*
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.ide.syncing.ui.decorators;
import org.eclipse.core.resources.IContainer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import com.aptana.ide.core.ui.CoreUIUtils;
import com.aptana.ide.syncing.core.ISiteConnection;
import com.aptana.ide.syncing.core.ResourceSynchronizationUtils;
import com.aptana.ide.syncing.core.SiteConnectionUtils;
import com.aptana.ide.syncing.ui.SyncingUIPlugin;
import com.aptana.ide.ui.io.navigator.INavigatorDecorator;
/**
* @author Michael Xia (mxia@aptana.com)
*/
public class SiteConnectionDecorator implements INavigatorDecorator {
private static final Image DECORATOR = SyncingUIPlugin
.getImage("icons/full/obj16/sync_connection.gif"); //$NON-NLS-1$
/**
* padding pixels
*/
private static final int PADDING = CoreUIUtils.onMacOSX ? 5 : 2;
public SiteConnectionDecorator() {
}
/**
* @see com.aptana.ide.core.ui.INavigatorDecorator#addDecorator(org.eclipse.swt.widgets.Tree)
*/
public void addDecorator(final Tree tree) {
if (isDisposed(tree)) {
return;
}
tree.addListener(SWT.MeasureItem, new Listener() {
public void handleEvent(Event event) {
int startWidth = event.width;
try {
if (!isDisposed(tree) && event.item instanceof TreeItem) {
Object data = ((TreeItem) event.item).getData();
if (data instanceof IContainer) {
String lastConnection = getLastSyncConnection((IContainer) data);
if (lastConnection != null) {
Point stringExtent = event.gc.stringExtent(lastConnection);
event.width += DECORATOR.getBounds().width + PADDING
+ stringExtent.x + PADDING;
}
}
}
} catch (Exception e) {
// Catch all exception so tree painting is never hindered by
// decoration
event.width = startWidth;
} catch (Error e) {
// Catch all exception so tree painting is never hindered by
// decoration
event.width = startWidth;
}
}
});
tree.addListener(SWT.PaintItem, new Listener() {
public void handleEvent(Event event) {
try {
if (!isDisposed(tree) && event.item instanceof TreeItem) {
Object data = ((TreeItem) event.item).getData();
if (data instanceof IContainer) {
String lastConnection = getLastSyncConnection((IContainer) data);
if (lastConnection != null) {
int x = event.x + event.width + PADDING;
int itemHeight = tree.getItemHeight();
int imageHeight = DECORATOR.getBounds().height;
int y = event.y + (itemHeight - imageHeight) / 2;
event.gc.drawImage(DECORATOR, x, y);
event.x = x + DECORATOR.getBounds().width;
x = event.x + PADDING;
Point stringExtent = event.gc.stringExtent(lastConnection);
y = event.y + (itemHeight - stringExtent.y) / 2;
event.gc.drawString(lastConnection, x, y, true);
event.x += stringExtent.x;
}
}
}
} catch (Exception e) {
// Catch all exception so tree painting is never hindered by
// decoration
} catch (Error e) {
// Catch all exception so tree painting is never hindered by
// decoration
}
}
});
}
private static String getLastSyncConnection(IContainer container) {
if (container == null) {
return null;
}
// only shows the decorator when user chooses to
// remember the decision
boolean remember = ResourceSynchronizationUtils.isRememberDecision(container);
if (!remember) {
return null;
}
String lastConnection = ResourceSynchronizationUtils.getLastSyncConnection(container);
if (lastConnection == null) {
return null;
}
ISiteConnection[] sites = SiteConnectionUtils.findSitesForSource(container, true);
String target;
for (ISiteConnection site : sites) {
target = site.getDestination().getName();
if (target.equals(lastConnection)) {
return target;
}
}
return null;
}
private static boolean isDisposed(Tree tree) {
return tree == null || tree.isDisposed();
}
}