/*
* File : UISWTViewImpl.java
* Created : Oct 14, 2005
* By : TuxPaper
*
* Copyright (C) 2005, 2006 Aelitis SAS, All rights Reserved
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* 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 General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* AELITIS, SAS au capital de 46,603.30 euros,
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/
package org.gudy.azureus2.ui.swt.pluginsimpl;
import java.awt.Frame;
import java.awt.Panel;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.LogEvent;
import org.gudy.azureus2.core3.logging.LogIDs;
import org.gudy.azureus2.core3.logging.Logger;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.ui.swt.plugins.UISWTView;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent;
import org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener;
import org.gudy.azureus2.ui.swt.views.AbstractIView;
import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
import com.aelitis.azureus.ui.swt.UIFunctionsSWT;
import org.gudy.azureus2.plugins.ui.UIRuntimeException;
/**
* @author TuxPaper
*
*/
public class UISWTViewImpl extends AbstractIView implements UISWTView {
public static final String CFG_PREFIX = "Views.plugins.";
private Object dataSource = null;
private final UISWTViewEventListener eventListener;
private Composite composite;
private final String sViewID;
private int iControlType = UISWTView.CONTROLTYPE_SWT;
private boolean bFirstGetCompositeCall = true;
private final String sParentID;
private String sTitle = null;
/**
*
* @param sViewID
* @param eventListener
*/
public UISWTViewImpl(String sParentID, String sViewID, UISWTViewEventListener eventListener)
throws Exception {
this.sParentID = sParentID;
this.sViewID = sViewID;
this.eventListener = eventListener;
if (!eventListener.eventOccurred(new UISWTViewEventImpl(this,
UISWTViewEvent.TYPE_CREATE, this)))
throw new Exception();
}
// UISWTPluginView implementation
// ==============================
public Object getDataSource() {
return dataSource;
}
public String getViewID() {
return sViewID;
}
public void closeView() {
try {
UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
if (uiFunctions != null) {
uiFunctions.closePluginView(this);
}
} catch (Exception e) {
Debug.out(e);
}
}
public void setControlType(int iControlType) {
if (iControlType == UISWTView.CONTROLTYPE_AWT
|| iControlType == UISWTView.CONTROLTYPE_SWT)
this.iControlType = iControlType;
}
public void triggerEvent(int eventType, Object data) {
try {
eventListener.eventOccurred(new UISWTViewEventImpl(this, eventType, data));
} catch (Throwable t) {
throw (new UIRuntimeException("UISWTView.triggerEvent:: ViewID="
+ sViewID + "; EventID=" + eventType + "; data=" + data, t));
}
}
private boolean triggerEvent2(int eventType, Object data) {
try {
return eventListener.eventOccurred(new UISWTViewEventImpl(this, eventType, data));
} catch (Throwable t) {
throw (new UIRuntimeException("UISWTView.triggerEvent:: ViewID="
+ sViewID + "; EventID=" + eventType + "; data=" + data, t));
}
}
public void setTitle(String title) {
sTitle = title;
}
// AbstractIView Implementation
// ============================
public void dataSourceChanged(Object newDataSource) {
dataSource = newDataSource;
triggerEvent(UISWTViewEvent.TYPE_DATASOURCE_CHANGED, newDataSource);
}
public void delete() {
triggerEvent(UISWTViewEvent.TYPE_DESTROY, null);
super.delete();
}
public Composite getComposite() {
if (bFirstGetCompositeCall) {
bFirstGetCompositeCall = false;
}
return composite;
}
public String getData() {
final String key = CFG_PREFIX + sViewID + ".title";
if (MessageText.keyExists(key))
return key;
// For now, to get plugin developers to update their plugins
// return key;
// For release, change it to this, to make it at least shorter:
return sViewID;
}
public String getFullTitle() {
if (sTitle != null)
return sTitle;
return super.getFullTitle();
}
public void initialize(Composite parent) {
if (iControlType == UISWTView.CONTROLTYPE_SWT) {
composite = new Composite(parent, SWT.NULL);
GridLayout layout = new GridLayout(1, false);
layout.marginHeight = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
GridData gridData = new GridData(GridData.FILL_BOTH);
composite.setLayoutData(gridData);
triggerEvent(UISWTViewEvent.TYPE_INITIALIZE, composite);
if (composite.getLayout() instanceof GridLayout) {
// Force children to have GridData layoutdata.
Control[] children = composite.getChildren();
for (int i = 0; i < children.length; i++) {
Control control = children[i];
Object layoutData = control.getLayoutData();
if (layoutData == null || !(layoutData instanceof GridData)) {
if (layoutData != null)
Logger.log(new LogEvent(LogIDs.PLUGIN, LogEvent.LT_WARNING,
"Plugin View '" + sViewID + "' tried to setLayoutData of "
+ control + " to a " + layoutData.getClass().getName()));
if (children.length == 1)
gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
else
gridData = new GridData();
control.setLayoutData(gridData);
}
}
}
} else {
composite = new Composite(parent, SWT.EMBEDDED);
FillLayout layout = new FillLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
GridData gridData = new GridData(GridData.FILL_BOTH);
composite.setLayoutData(gridData);
Frame f = SWT_AWT.new_Frame(composite);
Panel pan = new Panel();
f.add(pan);
triggerEvent(UISWTViewEvent.TYPE_INITIALIZE, pan);
}
if (composite != null) {
composite.addListener(SWT.Activate, new Listener() {
public void handleEvent(Event event) {
triggerEvent(UISWTViewEvent.TYPE_FOCUSGAINED, null);
}
});
composite.addListener(SWT.Deactivate, new Listener() {
public void handleEvent(Event event) {
triggerEvent(UISWTViewEvent.TYPE_FOCUSLOST, null);
}
});
}
}
public void refresh() {
triggerEvent(UISWTViewEvent.TYPE_REFRESH, null);
}
public void updateLanguage() {
super.updateLanguage();
triggerEvent(UISWTViewEvent.TYPE_LANGUAGEUPDATE, null);
}
// Core Functions
public String getParentID() {
return sParentID;
}
public boolean requestClose() {
return triggerEvent2(UISWTViewEvent.TYPE_CLOSE, null);
}
}