[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [platform-swt-dev] Re: Problem in Caturing excel events form SWT
|
I need to see the IDL for the events you are trying to catch.
Abhinav Mathur <abhinavlikesu@xxxxxxxxx>
Sent by: platform-swt-dev-bounces@xxxxxxxxxxx
06/16/2005 06:24 AM
Please respond to
Abhinav Mathur and "Eclipse Platform SWT component developers list."
To
platform-swt-dev@xxxxxxxxxxx
cc
Subject
[platform-swt-dev] Re: Problem in Caturing excel events form SWT
hi Veronika,
I tried to modify your code and run it for excel but it didnt
work.Esentialy what i am trying to do is if some one changes the value
in some excel sheet or presses some user defined buton to run macro ,I
should get a notification in my java program.
Below is my code which is a modfication of your code.Please see if you
can figure out where I went wrong.
---------------
import org.eclipse.swt.*;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.ole.win32.*;
import org.eclipse.swt.internal.ole.win32.*;
public class Snippet123 {
public static void main(String[] args) {
final Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
OleControlSite controlSite;
try {
OleFrame frame = new OleFrame(shell,
SWT.NONE);
controlSite = new OleControlSite(frame,
SWT.NONE, "Excel.Sheet");
int result=
controlSite.doVerb(OLE.OLEIVERB_OPEN);
System.out.println("Result\t"+result);
} catch (SWTError e) {
System.out.println("Unable to open
activeX control");
return;
}
shell.open();
// IWebBrowser
//final OleAutomation webBrowser = new
OleAutomation(controlSite);
//ExcelSheet
final OleAutomation excelSheet=new
OleAutomation(controlSite);
//When a workbook is opened
int Open=0x000102aa;
// When a new document is loaded, access the document
object for the new page.
//int DownloadComplete = 104;
controlSite.addEventListener(Open,new OleListener(){
public void handleEvent(OleEvent event){
//get the active sheet
Variant sheet =
excelSheet.getProperty(0x00010133);
OleAutomation
sheetAutomation=sheet.getAutomation();
//Request to be notified
of events
EventDispatch
myDispatch= new EventDispatch(EventDispatch.Activate);
IDispatch idispatch=new
IDispatch(myDispatch.getAddress());
Variant dispatch=new
Variant(idispatch);
sheetAutomation.setProperty(EventDispatch.Activate,dispatch);
myDispatch=new
EventDispatch(EventDispatch.Change);
idispatch = new
IDispatch(myDispatch.getAddress());
dispatch = new
Variant(idispatch);
sheetAutomation.setProperty(EventDispatch.Change,dispatch);
myDispatch=new
EventDispatch(EventDispatch.Deactivate);
idispatch = new
IDispatch(myDispatch.getAddress());
dispatch = new
Variant(idispatch);
sheetAutomation.setProperty(EventDispatch.Deactivate,dispatch);
//Release the Ole
automation Object
sheetAutomation.dispose();
}
});
//set the value in some cell
int id = excelSheet.getIDsOfNames(new
String[]{"ActiveSheet"})[0];
System.out.println(id);
Variant sheet = excelSheet.getProperty(id);
System.out.println("Sheet\t"+sheet);
int rangeId = sheet.getAutomation().getIDsOfNames(new
String[]{"Range"})[0];
System.out.println("RANGE ID ="+rangeId);
Variant[] arguments_1 = new Variant[1];
arguments_1[0]= new Variant("C2");
Variant range0 = sheet.getAutomation().getProperty(
rangeId, arguments_1 );
IDispatch rangeDispatch = range0.getDispatch();
int valueId = range0.getAutomation().getIDsOfNames(new
String[]{"value"})[0];
boolean value =
range0.getAutomation().setProperty(valueId,arguments_1);
System.out.println(value);
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
//disposing the atomation object
excelSheet.dispose();
display.dispose();
}
}
//EventDispatch implements a simple IDispatch interface which will be
called when the event is fired
class EventDispatch{
private COMObject iDispatch;
private int refCount =0;
private int eventID;
final static int Activate=0x00010130;
final static int Deactivate=0x000105fa;
final static int Change=0x00010609;
EventDispatch(int eventID)
{
this.eventID=eventID;
createCOMInterfaces();
}
int getAddress()
{
return iDispatch.getAddress();
}
private void createCOMInterfaces(){
iDispatch = new COMObject(new int[]{2, 0,
0, 1, 3, 4, 8}){
public int method0(int[]
args) {return QueryInterface(args[0], args[1]);}
public int method1(int[]
args) {return AddRef();}
public int method2(int[]
args) {return Release();}
// method3
GetTypeInfoCount - not implemented
// method4 GetTypeInfo -
not implemented
// method5 GetIDsOfNames
- not implemented
public int method6(int[]
args) {return Invoke(args[0], args[1],
args[2], args[3], args[4], args[5], args[6], args[7]);}
};
}
private void disposeCOMInterfaces() {
if (iDispatch != null)
iDispatch.dispose();
iDispatch = null;
}
private int AddRef() {
refCount++;
return refCount;
}
private int Invoke(int dispIdMember, int riid, int lcid,
int dwFlags,
int pDispParams, int pVarResult, int pExcepInfo, int pArgErr)
{
switch(eventID){
case Activate
:{System.out.println("Activate");break;}
case Change
:{System.out.println("Change");break;}
case
Deactivate:{System.out.println("Deactivate");break;}
}
return COM.S_OK;
}
private int QueryInterface(int riid, int ppvObject) {
if (riid == 0 || ppvObject == 0) return
COM.E_INVALIDARG;
GUID guid = new GUID();
COM.MoveMemory(guid, riid, GUID.sizeof);
if ( COM.IsEqualGUID(guid,
COM.IIDIUnknown) || COM.IsEqualGUID(guid,
COM.IIDIDispatch)) {
COM.MoveMemory(ppvObject,
new int[] {iDispatch.getAddress()}, 4);
AddRef();
return COM.S_OK;
}
COM.MoveMemory(ppvObject, new int[] {0},
4);
return COM.E_NOINTERFACE;
}
int Release() {
refCount--;
if (refCount == 0) {
disposeCOMInterfaces();
}
return refCount;
}
}
---------------------------------------------------
On 6/15/05, Abhinav Mathur <abhinavlikesu@xxxxxxxxx> wrote:
> hi,
> i am trying to capture excel events like change in sheet or sheet
> activation or clicking of some use defined button in my java code. I
> am unable to do it using SWT.can any body tell me where i am going
> wrong or some other API to it.Below s my code
>
>
> import java.io.File;
>
> import org.eclipse.swt.SWT;
> import org.eclipse.swt.SWTException;
> import org.eclipse.swt.internal.ole.win32.IDispatch;
> import org.eclipse.swt.layout.FillLayout;
> import org.eclipse.swt.ole.win32.OLE;
> import org.eclipse.swt.ole.win32.OleAutomation;
> import org.eclipse.swt.ole.win32.OleClientSite;
> import org.eclipse.swt.ole.win32.OleControlSite;
> import org.eclipse.swt.ole.win32.OleEvent;
> import org.eclipse.swt.ole.win32.OleFrame;
> import org.eclipse.swt.ole.win32.OleListener;
> import org.eclipse.swt.ole.win32.Variant;
> import org.eclipse.swt.widgets.Display;
> import org.eclipse.swt.widgets.Menu;
> import org.eclipse.swt.widgets.Shell;
> //with active sheet
> public class EventTry2 {
> private Shell shell;
>
> private static OleAutomation automation;
>
> static OleControlSite controlSite;
>
> protected static final int Activate = 0x00010130;
>
> protected static final int BeforeDoubleClick = 0x00010601;
>
> protected static final int BeforRightClick = 0x000105fe;
>
> protected static final int Calculate = 0x00010117;
>
> protected static final int Change = 0x00010609;
>
> protected static final int Deactivate = 0x000105fa;
>
> protected static final int FollowHyperlink = 0x000105be;
>
> protected static final int SelectionChange = 0x00010607;
>
> public void makeVisible()
> {
> Variant[] arguments = new Variant[1];
> arguments[0] = new Variant("true");
>
> //Visible---true
> automation.setProperty(558,arguments);
>
>
> // EnableEvent--true
> automation.setProperty(1212, arguments);
>
>
> }
>
> public Shell open(Display display)
> {
> this.shell = new Shell(display);
> this.shell.setLayout(new FillLayout());
> Menu bar = new Menu(this.shell, SWT.BAR);
> this.shell.setMenuBar(bar);
> OleFrame frame = new OleFrame(shell, SWT.NONE);
> File file = new File("C:\\Book1.xls");
> try {
> controlSite = new OleControlSite(frame, SWT.NONE,
> "Excel.Application");
> this.shell.layout();
> boolean a2 = true;
> a2 = (controlSite.doVerb(OLE.OLEIVERB_SHOW |
OLE.OLEIVERB_OPEN
> | OLE.OLEIVERB_UIACTIVATE |
OLE.OLEIVERB_HIDE
> | OLE.OLEIVERB_PROPERTIES |
OLE.OLEIVERB_INPLACEACTIVATE) == OLE.S_OK);
> System.out.println("Activated::\t" + a2);
> } catch (SWTException ex) {
> System.out.println(ex.getMessage());
> return null;
> }
> automation = new OleAutomation(controlSite);
>
> // make the application visible
> makeVisible();
>
> System.out.println("Going to create Event listener");
> OleListener eventListener = new OleListener() {
>
> public void handleEvent(OleEvent event) {
> System.out.println("EVENT TYPE==\t" +
event.type);
> switch (event.type) {
>
> case Activate: {
> System.out.println("Activate
Event");
> }
>
> case BeforeDoubleClick: {
> System.out.println("BeforeDoubleClick Event");
> }
>
> case BeforRightClick: {
> System.out.println("BeforeRightClick Event");
> }
>
> case Calculate: {
> System.out.println("Calculate
Event");
> }
>
> case Change: {
> System.out.println("Change
Event");
> }
>
> case Deactivate: {
> System.out.println("DeActivate
Event");
> }
>
> case FollowHyperlink: {
> System.out.println("Activate
Event");
> }
>
> case SelectionChange: {
> System.out.println("Activate
Event");
> }
>
> }
> Variant[] arguments = event.arguments;
> for (int i = 0; i < arguments.length;
i++) {
> System.out.println("@@");
> arguments[i].dispose();
> }
> }
>
> };
>
> System.out.println("outside");
> OleAutomation sheetAutomation =
this.openFile("C:\\Book1.xls");
>
> controlSite.addEventListener(sheetAutomation, Activate,
eventListener);
> controlSite.addEventListener(sheetAutomation,
BeforeDoubleClick,
> eventListener);
> controlSite.addEventListener(sheetAutomation,
BeforRightClick,
> eventListener);
> controlSite.addEventListener(sheetAutomation, Calculate,
eventListener);
> controlSite.addEventListener(sheetAutomation, Change,
eventListener);
> controlSite
> .addEventListener(sheetAutomation,
Deactivate, eventListener);
> controlSite.addEventListener(sheetAutomation,
FollowHyperlink,
> eventListener);
> controlSite.addEventListener(sheetAutomation,
SelectionChange,
> eventListener);
>
> int rangeId = sheetAutomation.getIDsOfNames(new String[]
{ "Range" })[0];
> System.out.println(rangeId);
> Variant[] arguments_1 = new Variant[1];
> arguments_1[0] = new Variant("C2");
> Variant range0 = sheetAutomation.getProperty(rangeId,
arguments_1);
> IDispatch rangeDispatch = range0.getDispatch();
>
> int valueId = range0.getAutomation().getIDsOfNames(
> new String[] { "value" })[0];
>
> Variant value =
range0.getAutomation().getProperty(valueId);
>
> System.out.println(value.getInt());
>
> Variant[] newValue = new Variant[1];
> newValue[0] = new Variant(216);
>
> range0.getAutomation().setProperty(valueId, newValue);
> value = range0.getAutomation().getProperty(valueId);
>
> System.out.println(value.getInt());
>
> shell.open();
> return shell;
> }
>
> public OleAutomation openFile(String fileName) {
> Variant workbooks = automation.getProperty(0x0000023c);//
get User
> // Defined
> // Workbooks
> Variant[] arguments = new Variant[1];
>
> arguments[0] = new Variant(fileName);
> System.out.println("workbooks::\t" + workbooks);
>
>
> int[] rgdispid = workbooks.getAutomation().getIDsOfNames(
> new String[] { "Open" });
> int dispIdMember = rgdispid[0];
> Variant workbook =
workbooks.getAutomation().invoke(dispIdMember,
> arguments);
> System.out.println("Opened the Work Book");
> try {
> Thread.sleep(500);
> } catch (InterruptedException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
> int id = workbook.getAutomation().getIDsOfNames(
> new String[] { "ActiveSheet" })[0];
> System.out.println(id);
> Variant sheet = workbook.getAutomation().getProperty(id);
> OleAutomation sheetAutomation = sheet.getAutomation();
>
> return (sheetAutomation);
> }
>
> /**
> * @param args
> */
> public static void main(String[] args) {
> // TODO Auto-generated method stub
>
> Display display = new Display();
> Shell shell = (new EventTry2()).open(display);
> while (!shell.isDisposed()) {
> if (!display.readAndDispatch()) {
> display.sleep();
> }
> }
> controlSite.dispose();
> display.dispose();
>
> System.out
> .println("-----------------THE
END-----------------------------");
>
> }
>
> }
>
_______________________________________________
platform-swt-dev mailing list
platform-swt-dev@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/platform-swt-dev