blob: 9f529660e0e3f0edf1e18b68f0345e9693744311 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 com.sun.star.wizards.document;
import com.sun.star.awt.Point;
import com.sun.star.awt.Size;
import com.sun.star.awt.VclWindowPeerAttribute;
import com.sun.star.awt.XControlModel;
import com.sun.star.awt.XDevice;
import com.sun.star.beans.XPropertySet;
import com.sun.star.container.NoSuchElementException;
import com.sun.star.container.XChild;
import com.sun.star.container.XNameAccess;
import com.sun.star.container.XNameContainer;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.view.XControlAccess;
import com.sun.star.wizards.common.*;
import com.sun.star.sdbc.DataType;
import com.sun.star.text.XTextDocument;
import com.sun.star.uno.Exception;
import com.sun.star.uno.Type;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.AnyConverter;
import com.sun.star.uno.XInterface;
import com.sun.star.drawing.XControlShape;
import com.sun.star.drawing.XDrawPage;
import com.sun.star.drawing.XDrawPageSupplier;
import com.sun.star.drawing.XShape;
import com.sun.star.drawing.XShapeGrouper;
import com.sun.star.drawing.XShapes;
import com.sun.star.form.XFormsSupplier;
import com.sun.star.lang.IllegalArgumentException;
import com.sun.star.lang.XComponent;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.lang.XServiceInfo;
import com.sun.star.container.XNamed;
import java.util.logging.Level;
import java.util.logging.Logger;
public class FormHandler
{
private static final String CHECKBOX = "CheckBox";
private static final String DATEFIELD = "DateField";
private static final String FORMATTEDFIELD = "FormattedField";
private static final String IMAGECONTROL = "ImageControl";
private static final String TEXTFIELD = "TextField";
private static final String TIMEFIELD = "TimeField";
public XFormsSupplier xFormsSupplier;
public XMultiServiceFactory xMSFDoc;
public XMultiServiceFactory xMSF;
public XDrawPage xDrawPage;
private XDrawPageSupplier xDrawPageSupplier;
public String[] sModelServices = new String[8];
public static ControlData[] oControlData;
public final static int SOLABEL = 0;
public final static int SOTEXTBOX = 1;
public final static int SOCHECKBOX = 2;
public final static int SODATECONTROL = 3;
public final static int SOTIMECONTROL = 4;
public final static int SONUMERICCONTROL = 5;
public final static int SOGRIDCONTROL = 6;
public final static int SOIMAGECONTROL = 7;
public final static int SODATETIMECONTROL = 8;
int iImageControlHeight = 2000;
public static String SOSIZETEXT = "The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog.";
int iXPixelFactor = -1;
int iYPixelFactor = -1;
int iXNirwanaPos = 50000;
int iYNirwanaPos = 50000;
public int nLabelHeight = -1;
public int nDBRefHeight = -1;
public int BasicLabelDiffHeight = -1;
XNameAccess xNamedForms;
XControlAccess xControlAccess;
XShapeGrouper xShapeGrouper;
XNameContainer xNamedFormContainer;
public class ControlData
{
int DataType;
int ControlType;
String ControlService;
String GridColumnName;
boolean bIsText;
}
/** Creates a new instance of FormHandler */
public FormHandler(XMultiServiceFactory _xMSF, XTextDocument xTextDocument)
{
this.xMSF = _xMSF;
xDrawPageSupplier = UnoRuntime.queryInterface(XDrawPageSupplier.class, xTextDocument);
xDrawPage = xDrawPageSupplier.getDrawPage();
xFormsSupplier = UnoRuntime.queryInterface(XFormsSupplier.class, xDrawPage);
xShapeGrouper = UnoRuntime.queryInterface(XShapeGrouper.class, xDrawPage);
xControlAccess = UnoRuntime.queryInterface(XControlAccess.class, xTextDocument.getCurrentController());
xMSFDoc = UnoRuntime.queryInterface(XMultiServiceFactory.class, xTextDocument);
sModelServices[SOLABEL] = "com.sun.star.form.component.FixedText";
sModelServices[SOTEXTBOX] = "com.sun.star.form.component.TextField";
sModelServices[SOCHECKBOX] = "com.sun.star.form.component.CheckBox";
sModelServices[SODATECONTROL] = "com.sun.star.form.component.DateField";
sModelServices[SOTIMECONTROL] = "com.sun.star.form.component.TimeField";
sModelServices[SONUMERICCONTROL] = "com.sun.star.form.component.FormattedField";
sModelServices[SOGRIDCONTROL] = "com.sun.star.form.component.GridControl";
sModelServices[SOIMAGECONTROL] = "com.sun.star.form.component.DatabaseImageControl";
oControlData = new ControlData[22];
oControlData[0] = createControlData(DataType.BIT, SOCHECKBOX, CHECKBOX, CHECKBOX, false);
oControlData[1] = createControlData(DataType.BOOLEAN, SOCHECKBOX, CHECKBOX, CHECKBOX, false);
oControlData[2] = createControlData(DataType.TINYINT, SONUMERICCONTROL, FORMATTEDFIELD, FORMATTEDFIELD, false);
oControlData[3] = createControlData(DataType.SMALLINT, SONUMERICCONTROL, FORMATTEDFIELD, FORMATTEDFIELD, false);
oControlData[4] = createControlData(DataType.INTEGER, SONUMERICCONTROL, FORMATTEDFIELD, FORMATTEDFIELD, false);
oControlData[5] = createControlData(DataType.BIGINT, SONUMERICCONTROL, FORMATTEDFIELD, FORMATTEDFIELD, false);
oControlData[6] = createControlData(DataType.FLOAT, SONUMERICCONTROL, FORMATTEDFIELD, FORMATTEDFIELD, false);
oControlData[7] = createControlData(DataType.REAL, SONUMERICCONTROL, FORMATTEDFIELD, FORMATTEDFIELD, false);
oControlData[8] = createControlData(DataType.DOUBLE, SONUMERICCONTROL, FORMATTEDFIELD, FORMATTEDFIELD, false);
oControlData[9] = createControlData(DataType.NUMERIC, SONUMERICCONTROL, FORMATTEDFIELD, FORMATTEDFIELD, false);
oControlData[10] = createControlData(DataType.DECIMAL, SONUMERICCONTROL, FORMATTEDFIELD, FORMATTEDFIELD, false);
oControlData[11] = createControlData(DataType.CHAR, SOTEXTBOX, TEXTFIELD, TEXTFIELD, false);
oControlData[12] = createControlData(DataType.VARCHAR, SOTEXTBOX, TEXTFIELD, TEXTFIELD, true);
oControlData[13] = createControlData(DataType.LONGVARCHAR, SOTEXTBOX, TEXTFIELD, TEXTFIELD, true);
oControlData[14] = createControlData(DataType.DATE, SODATECONTROL, DATEFIELD, DATEFIELD, false);
oControlData[15] = createControlData(DataType.TIME, SOTIMECONTROL, TIMEFIELD, TIMEFIELD, false);
oControlData[16] = createControlData(DataType.TIMESTAMP, SODATECONTROL, DATEFIELD, TEXTFIELD, false);
// oImageControlData = new ControlData[4];
oControlData[17] = createControlData(DataType.BINARY, SOIMAGECONTROL, IMAGECONTROL, TEXTFIELD, false);
oControlData[18] = createControlData(DataType.VARBINARY, SOIMAGECONTROL, IMAGECONTROL, TEXTFIELD, false);
oControlData[19] = createControlData(DataType.LONGVARBINARY, SOIMAGECONTROL, IMAGECONTROL, TEXTFIELD, false);
oControlData[20] = createControlData(DataType.BLOB, SOIMAGECONTROL, IMAGECONTROL, TEXTFIELD, false);
oControlData[21] = createControlData(DataType.OTHER, SOIMAGECONTROL, IMAGECONTROL, TEXTFIELD, false);
}
public int getControlType(int _fieldtype)
{
for (int i = 0; i < oControlData.length; i++)
{
if (oControlData[i].DataType == _fieldtype)
{
return oControlData[i].ControlType;
}
}
return -1;
}
public void setglobalMultiServiceFactory(XMultiServiceFactory _xMSF)
{
xMSF = _xMSF;
}
public String getModelServiceName(int _fieldtype)
{
int icontroltype = getControlType(_fieldtype);
if (icontroltype > -1)
{
return sModelServices[icontroltype];
}
else
{
return null;
}
}
public void initializeBasicControlValues()
{
Control oLabelControl = new Control(this, SOLABEL, new Point(), new Size());
XDevice xDevice = UnoRuntime.queryInterface(XDevice.class, oLabelControl.xWindowPeer);
iXPixelFactor = (int) (100000 / xDevice.getInfo().PixelPerMeterX);
iYPixelFactor = (int) (100000 / xDevice.getInfo().PixelPerMeterY);
nLabelHeight = (oLabelControl.getPreferredHeight("The quick brown fox...") + 1);
Control oTextControl = new Control(this, SOTEXTBOX, new Point(), new Size());
nDBRefHeight = (oTextControl.getPreferredHeight("The quick brown fox...") + 1);
BasicLabelDiffHeight = (nDBRefHeight - nLabelHeight) / 2;
xDrawPage.remove(oLabelControl.xShape);
xDrawPage.remove(oTextControl.xShape);
}
public ControlData createControlData(int _datatype, int _controltype, String _scontrolservicename, String _gridcolumnname, boolean _bIsTextControl)
{
ControlData curControlData = new ControlData();
curControlData.DataType = _datatype;
curControlData.ControlType = _controltype;
curControlData.ControlService = _scontrolservicename;
curControlData.GridColumnName = _gridcolumnname;
curControlData.bIsText = _bIsTextControl;
return curControlData;
}
public XNameContainer getDocumentForms()
{
return xFormsSupplier.getForms();
}
public String getValueofHiddenControl(XNameAccess xNamedForm, String ControlName)
{
String value = "";
try
{
if (xNamedForm.hasByName(ControlName))
{
value = AnyConverter.toString(com.sun.star.wizards.common.Helper.getUnoPropertyValue(xNamedForm.getByName(ControlName), "HiddenValue"));
}
}
catch (Exception ex)
{
Logger.getLogger( FormHandler.class.getName() ).log( Level.SEVERE, null, ex );
}
return value;
}
public void insertHiddenControl(XNameAccess xNameAccess, XNameContainer xNamedForm, String ControlName, String ControlValue)
{
try
{
XInterface xHiddenControl;
if (xNameAccess.hasByName(ControlName))
{
xHiddenControl = (XInterface) AnyConverter.toObject(new Type(XInterface.class), xNameAccess.getByName(ControlName));
}
else
{
xHiddenControl = (XInterface) xMSFDoc.createInstance("com.sun.star.form.component.HiddenControl");
xNamedForm.insertByName(ControlName, xHiddenControl);
}
Helper.setUnoPropertyValue(xHiddenControl, "HiddenValue", ControlValue);
}
catch (Exception ex)
{
Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
public boolean hasFormByName(String _FormName)
{
xNamedFormContainer = getDocumentForms();
xNamedForms = UnoRuntime.queryInterface(XNameAccess.class, xNamedFormContainer);
return xNamedForms.hasByName(_FormName);
}
public void removeFormByName(String _FormName)
{
try
{
if (hasFormByName(_FormName))
{
removeControlsofForm(_FormName);
xNamedFormContainer.removeByName(_FormName);
}
}
catch (com.sun.star.uno.Exception ex)
{
Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void removeControlsofForm(String _FormName)
{
try
{
for (int i = xDrawPage.getCount() - 1; i >= 0; i--)
{
if (belongsToForm(xDrawPage.getByIndex(i), _FormName))
{
XShape xShape = UnoRuntime.queryInterface(XShape.class, xDrawPage.getByIndex(i));
xDrawPage.remove(xShape);
}
}
}
catch (Exception e)
{
Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e);
}
}
public void removeElement( XNameContainer _parentContainer, String _formName )
{
try
{
_parentContainer.removeByName( _formName );
}
catch ( WrappedTargetException e )
{
Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e);
}
catch( final NoSuchElementException e )
{
Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e);
}
}
public boolean belongsToForm(Object _oDrawPageElement, String _FormName)
{
XServiceInfo xServiceInfo = UnoRuntime.queryInterface(XServiceInfo.class, _oDrawPageElement);
if (xServiceInfo.supportsService("com.sun.star.drawing.ControlShape"))
{
XControlShape xControlShape = UnoRuntime.queryInterface(XControlShape.class, _oDrawPageElement);
XControlModel xControlModel = xControlShape.getControl();
xServiceInfo = UnoRuntime.queryInterface(XServiceInfo.class, xControlShape.getControl());
if (xServiceInfo.supportsService("com.sun.star.form.FormComponent"))
{
XChild xChild = UnoRuntime.queryInterface(XChild.class, xControlModel);
XNamed xNamed = UnoRuntime.queryInterface(XNamed.class, xChild.getParent());
String sName = xNamed.getName();
return _FormName.equals(sName);
}
}
return false;
}
public XNameContainer insertFormbyName(String _FormName, XNameContainer _xNamedFormContainer)
{
try
{
Object oDBForm;
if (!hasFormByName(_FormName))
{
oDBForm = xMSFDoc.createInstance("com.sun.star.form.component.Form");
_xNamedFormContainer.insertByName(_FormName, oDBForm);
XNameContainer xNamedForm;
xNamedForm = UnoRuntime.queryInterface(XNameContainer.class, oDBForm);
return xNamedForm;
}
else
{
return getFormByName(_FormName);
}
}
catch (com.sun.star.uno.Exception e)
{
Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e);
return null;
}
}
public XNameContainer insertSubFormbyName(String _FormName, XNameContainer _xNamedFormContainer)
{
return insertFormbyName(_FormName, _xNamedFormContainer);
}
public XNameContainer insertFormbyName(String _FormName)
{
return insertFormbyName(_FormName, getDocumentForms());
}
public XNameContainer getFormByName(String _sname)
{
XNameContainer xNamedForm = null;
try
{
if (xNamedForms.hasByName(_sname))
{
Object oDBForm = AnyConverter.toObject(new Type(XInterface.class), Helper.getUnoObjectbyName(xNamedForms, _sname));
xNamedForm = UnoRuntime.queryInterface(XNameContainer.class, oDBForm);
}
}
catch (IllegalArgumentException e)
{
Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e);
}
return xNamedForm;
}
/**
* @return
*/
public int getXPixelFactor()
{
if (iXPixelFactor == -1)
{
initializeBasicControlValues();
}
return iXPixelFactor;
}
/**
* @return
*/
public int getYPixelFactor()
{
if (iYPixelFactor == -1)
{
initializeBasicControlValues();
}
return iYPixelFactor;
}
/**
* @param i
*/
public void setXPixelFactor(int i)
{
iXPixelFactor = i;
}
/**
* @param i
*/
public void setYPixelFactor(int i)
{
iYPixelFactor = i;
}
/**
* @return
*/
public int getImageControlHeight()
{
return iImageControlHeight;
}
/**
* @param i
*/
public void setImageControlHeight(int i)
{
iImageControlHeight = i;
}
// Note: as Shapes cannot be removed from the DrawPage without destroying
// the object we have to park them somewhere beyond the visible area of the page
public void moveShapesToNirwana(Control[] ControlList)
{
if (ControlList != null)
{
for (int i = 0; i < ControlList.length; i++)
{
if (ControlList[i] != null)
// try {
// this.xDrawPage.remove(ControlList[i].xShape);
{
ControlList[i].setPosition(new Point(this.iXNirwanaPos, this.iYNirwanaPos));
// String sControlName = (String) ControlList[i].xPropertySet.getPropertyValue(PropertyNames.PROPERTY_NAME);
//
// if (_xNamedForm.hasByName(sControlName))
// _xNamedForm.removeByName(sControlName);
// } catch (Exception e) {
// e.printStackTrace(System.out);
// }
}
}
}
}
public void moveShapesToNirwana()
{
try
{
for (int i = 0; i < this.xDrawPage.getCount(); i++)
{
XShape xShape = UnoRuntime.queryInterface(XShape.class, xDrawPage.getByIndex(i));
xShape.setPosition(new Point(this.iXNirwanaPos, this.iYNirwanaPos));
}
}
catch (Exception e)
{
Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e);
}
}
public void removeAllShapes() throws Exception
{
for (int i = this.xDrawPage.getCount(); i > -1; i--)
{
XShape xShape = UnoRuntime.queryInterface(XShape.class, xDrawPage.getByIndex(i));
removeShape(xShape);
}
}
/**
* By removing the shape the whole control is disposed too
*
*/
public void removeShape(XShape _xShape)
{
xDrawPage.remove(_xShape);
XComponent xComponent = UnoRuntime.queryInterface(XComponent.class, _xShape);
xComponent.dispose();
}
// Destroy all Shapes in Nirwana
public void removeNirwanaShapes() throws Exception
{
for (int i = this.xDrawPage.getCount(); i > -1; i--)
{
XShape xShape = UnoRuntime.queryInterface(XShape.class, xDrawPage.getByIndex(i));
if (xShape.getPosition().Y < this.iYNirwanaPos)
{
xDrawPage.remove(xShape);
}
}
}
public XShape groupShapesTogether(XMultiServiceFactory _xMSF, XShape _xLabelShape, XShape _xControlShape)
{
try
{
Object oGroupShape = _xMSF.createInstance("com.sun.star.drawing.ShapeCollection");
XShapes xShapes = UnoRuntime.queryInterface(XShapes.class, oGroupShape);
xShapes.add(_xLabelShape);
xShapes.add(_xControlShape);
return this.xShapeGrouper.group(xShapes);
}
catch (Exception e)
{
Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e);
return null;
}
}
/**
* @return
*/
public int getBasicLabelDiffHeight()
{
if (this.BasicLabelDiffHeight == -1)
{
initializeBasicControlValues();
}
return BasicLabelDiffHeight;
}
/**
* @return
*/
public int getControlReferenceHeight()
{
if (this.nDBRefHeight == -1)
{
initializeBasicControlValues();
}
return nDBRefHeight;
}
/**
* @return
*/
public int getLabelHeight()
{
if (this.nLabelHeight == -1)
{
initializeBasicControlValues();
}
return nLabelHeight;
}
public void setDrawObjectsCaptureMode(boolean _bCaptureObjects)
{
try
{
XPropertySet xPropertySet = UnoRuntime.queryInterface(XPropertySet.class, this.xMSFDoc.createInstance("com.sun.star.text.DocumentSettings"));
xPropertySet.setPropertyValue("DoNotCaptureDrawObjsOnPage", Boolean.valueOf(!_bCaptureObjects));
}
catch (Exception e)
{
Logger.getLogger(FormHandler.class.getName()).log(Level.SEVERE, null, e);
}
}
}