/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.excel.gui.properties; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import com.jacob.activeX.ActiveXComponent; import com.jacob.activeX.ActiveXInvocationProxy; import com.jacob.com.Dispatch; import com.jacob.com.DispatchProxy; import com.jacob.com.Variant; import de.rcenvironment.components.excel.common.ExcelAddress; import de.rcenvironment.components.excel.common.ExcelComponentConstants; import de.rcenvironment.components.excel.common.ExcelServiceGUIEvents; import de.rcenvironment.core.utils.incubator.ServiceRegistry; import de.rcenvironment.core.utils.incubator.ServiceRegistryAccess; /** * Simple Dialog for selection of Excel cell address. * * @author Markus Kunde */ public class CellSelectionDialog extends Dialog { private static final int MAX_HEIGHT = 100; private static final int MAX_WIDTH = 430; protected Shell shlExcelAddress; private Text textCellAddress; private VariablesEditDialog varDialog; private String initAddress; private ExcelServiceGUIEvents excelEvents; private DispatchProxy dispatchProxy; /** * Create the dialog. * @param parent * @param style */ public CellSelectionDialog(Shell parent, int style, VariablesEditDialog dialog) { super(parent, style); setText("SWT Dialog"); varDialog = dialog; ServiceRegistryAccess serviceRegistryAccess = ServiceRegistry.createAccessFor(this); excelEvents = serviceRegistryAccess.getService(ExcelServiceGUIEvents.class); } /** * Open the dialog. * @param initialAddress initial Address of Excel cell */ public void open(final String initialAddress) { createContents(); shlExcelAddress.open(); shlExcelAddress.layout(); initAddress = initialAddress; setAddress(initAddress); ActiveXComponent objExcel = excelEvents.openExcelApplicationRegisterListener(varDialog.getFile(), initAddress, new ExcelApplicationEventsProxy()); dispatchProxy = new DispatchProxy(objExcel); } /** * Closes the dialog. * */ public void close() { ActiveXComponent objExcel = new ActiveXComponent(dispatchProxy.toDispatch()); if (objExcel != null) { excelEvents.quitExcel(objExcel, false); } getParent().dispose(); } /** * Create contents of the dialog. */ private void createContents() { shlExcelAddress = new Shell(getParent(), getStyle()); shlExcelAddress.setSize(MAX_WIDTH, MAX_HEIGHT); shlExcelAddress.setText("Excel Address Selection Dialog"); shlExcelAddress.setLayout(new FormLayout()); textCellAddress = new Text(shlExcelAddress, SWT.BORDER); FormData fdtextCellAddress = new FormData(); fdtextCellAddress.top = new FormAttachment(0, 10); fdtextCellAddress.left = new FormAttachment(0); fdtextCellAddress.right = new FormAttachment(MAX_HEIGHT); textCellAddress.setLayoutData(fdtextCellAddress); final Button btnOk = new Button(shlExcelAddress, SWT.NONE); FormData fdbtnOk = new FormData(); fdbtnOk.top = new FormAttachment(textCellAddress, 6); btnOk.setLayoutData(fdbtnOk); btnOk.setText("OK"); final Button btnCancel = new Button(shlExcelAddress, SWT.NONE); fdbtnOk.right = new FormAttachment(btnCancel); btnCancel.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { } }); FormData fdbtnCancel = new FormData(); fdbtnCancel.top = new FormAttachment(textCellAddress, 6); fdbtnCancel.right = new FormAttachment(textCellAddress, 0, SWT.RIGHT); btnCancel.setLayoutData(fdbtnCancel); btnCancel.setText("Cancel"); Listener listener = new Listener() { @Override public void handleEvent(Event event) { if (event.widget != btnOk) { setAddress(initAddress); } varDialog.notifyAboutSelection(); } }; btnOk.addListener(SWT.Selection, listener); btnCancel.addListener(SWT.Selection, listener); } /** * Sets Excels cell address. * * @param address in Excel */ public void setAddress(final String address) { textCellAddress.setText(address); } /** * Returns Excels cell address. * * @return address in Excel */ public String getAddress() { return textCellAddress.getText(); } /** * Listener for gui events. * * @author Markus Kunde */ class ExcelApplicationEventsProxy extends ActiveXInvocationProxy { /** * {@inheritDoc} * * @see com.jacob.activeX.ActiveXInvocationProxy#invoke(java.lang.String, com.jacob.com.Variant[]) */ @Override public Variant invoke(String methodName, Variant[] targetParameter) { if (methodName.equalsIgnoreCase("SheetSelectionChange")) { sheetSelectionChange(targetParameter); } return null; } private void sheetSelectionChange(Variant[] arguments) { if (arguments.length == 2) { Dispatch range = arguments[0].getDispatch(); String rangeAddress = Dispatch.get(range, "Address").getString(); Dispatch worksheet = Dispatch.get(range, "Worksheet").toDispatch(); String worksheetName = Dispatch.get(worksheet, "Name").getString(); ExcelAddress addr = new ExcelAddress(varDialog.getFile(), worksheetName + ExcelComponentConstants.DIVIDER_TABLECELLADDRESS + rangeAddress); if (addr != null) { setAddress(addr.getFullAddress()); } } else { throw new RuntimeException("Return target-arguments of 'SheetSelectionChange(Sh, Target)' does not have length of 2."); } } } }