/**************************************************************
 * 
 * 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 util;

import com.sun.star.awt.Point;
import com.sun.star.beans.PropertyValue;
import com.sun.star.drawing.PolygonFlags;
//import util.BitmapLoader;
import com.sun.star.uno.Enum ;
import java.lang.reflect.Field ;
import java.lang.reflect.Method ;
import java.lang.reflect.Modifier ;
import java.lang.reflect.Array ;
import com.sun.star.uno.Any;
import com.sun.star.uno.AnyConverter;


public class ValueChanger {


 // Method to change a Value, thought for properties
 public static Object changePValue( Object oldValue ) {

   Object newValue = null;
   
   if (oldValue instanceof com.sun.star.uno.Any) {
     try {
        oldValue = AnyConverter.toObject(((Any) oldValue).getType(),oldValue);
     } catch (com.sun.star.lang.IllegalArgumentException iae) {
     }
   }

   if (oldValue == null)
     return null;

   if (oldValue instanceof Boolean) {
     boolean oldbool = ((Boolean) oldValue).booleanValue();
     newValue = new Boolean(!oldbool);
   } else

   if (oldValue instanceof Integer) {
     int oldint = ((Integer) oldValue).intValue();
     newValue = new Integer(oldint+5);
   } else

   if (oldValue instanceof Long) {
     long oldlong = ((Long) oldValue).longValue();
     newValue = new Long(oldlong + 15);
   } else

   if (oldValue instanceof Short) {
     short oldshort = ((Short) oldValue).shortValue();
     newValue = new Short((short) (oldshort + 1));
   } else

   if (oldValue instanceof Byte) {
     byte oldbyte = ((Byte) oldValue).byteValue();
     newValue = new Byte((byte) (oldbyte + 1));
   } else

   if (oldValue instanceof Float) {
     float oldfloat = ((Float) oldValue).floatValue();
     newValue = new Float((float) (oldfloat + 16.7));
   } else

   if (oldValue instanceof Double) {
     double olddouble = ((Double) oldValue).doubleValue();
     newValue = new Double(olddouble + 17.8);
   } else

   if (oldValue instanceof String) {
     String oldString = (String) oldValue;
     newValue = oldString + "New";
   } else


   if (oldValue instanceof com.sun.star.chart.ChartAxisArrangeOrderType) {
         Object AO1 = com.sun.star.chart.ChartAxisArrangeOrderType.AUTO;
         Object AO2=  com.sun.star.chart.ChartAxisArrangeOrderType.SIDE_BY_SIDE;
         Object AO3=  com.sun.star.chart.ChartAxisArrangeOrderType.STAGGER_EVEN;
         Object AO4=  com.sun.star.chart.ChartAxisArrangeOrderType.STAGGER_ODD;

         if (oldValue.equals(AO1)) newValue = AO2;
         if (oldValue.equals(AO2)) newValue = AO3;
         if (oldValue.equals(AO3)) newValue = AO4;
         if (oldValue.equals(AO4)) newValue = AO1;
   } else

   if (oldValue instanceof com.sun.star.view.PaperOrientation) {
         Object OR1 = com.sun.star.view.PaperOrientation.LANDSCAPE;
         Object OR2 = com.sun.star.view.PaperOrientation.PORTRAIT;

         if (oldValue.equals(OR1)) newValue = OR2;
                             else newValue = OR1;
   } else

   if (oldValue instanceof com.sun.star.lang.Locale) {
         Object Loc1 = new com.sun.star.lang.Locale("en","US","");
         Object Loc2 = new com.sun.star.lang.Locale("de","DE","");

         if (oldValue.equals(Loc1)) newValue = Loc2;
                             else newValue = Loc1;
   } else

   if (oldValue instanceof com.sun.star.style.ParagraphAdjust) {
         Object PA1 = com.sun.star.style.ParagraphAdjust.LEFT;
         Object PA2 = com.sun.star.style.ParagraphAdjust.CENTER;

         if (oldValue.equals(PA1)) newValue = PA2;
                             else newValue = PA1;
   } else

   if (oldValue instanceof com.sun.star.style.LineSpacing) {
         com.sun.star.style.LineSpacing LS = new com.sun.star.style.LineSpacing();
         com.sun.star.style.LineSpacing LSold = (com.sun.star.style.LineSpacing) oldValue;
         LS.Height = (short) ((LSold.Height)+1);
         LS.Mode = (short) ((LSold.Mode)+1);
         newValue = LS;
   } else

   if (oldValue instanceof com.sun.star.drawing.Direction3D) {
         com.sun.star.drawing.Direction3D D3D = new com.sun.star.drawing.Direction3D();
         com.sun.star.drawing.Direction3D D3Dold = (com.sun.star.drawing.Direction3D) oldValue;
         D3D.DirectionX = D3Dold.DirectionX + .5;
         D3D.DirectionY = D3Dold.DirectionY + .5;
         D3D.DirectionZ = D3Dold.DirectionZ + .5;
         newValue = D3D;
   } else

   if (oldValue instanceof com.sun.star.style.GraphicLocation) {
         Object GL1 = com.sun.star.style.GraphicLocation.AREA;
         Object GL2 = com.sun.star.style.GraphicLocation.LEFT_BOTTOM;

         if (oldValue.equals(GL1)) newValue = GL2;
                             else newValue = GL1;
   } else

   if (oldValue instanceof com.sun.star.style.TabStop) {
         com.sun.star.style.TabStop TS = new com.sun.star.style.TabStop();
         com.sun.star.style.TabStop TSold = (com.sun.star.style.TabStop) oldValue;
         com.sun.star.style.TabAlign TA1 = com.sun.star.style.TabAlign.CENTER;
         com.sun.star.style.TabAlign TA2 = com.sun.star.style.TabAlign.RIGHT;

         if ((TSold.Alignment).equals(TA1)) TS.Alignment = TA2;
                             else TS.Alignment = TA1;

         TS.Position = ((TSold.Position)+1);

         newValue = TS;
   } else

   if (oldValue instanceof com.sun.star.style.DropCapFormat) {
         com.sun.star.style.DropCapFormat DCF = new com.sun.star.style.DropCapFormat();
         com.sun.star.style.DropCapFormat DCFold = (com.sun.star.style.DropCapFormat) oldValue;
         DCF.Count = (byte) ((DCFold.Count)+1);
         DCF.Distance = (short) ((DCFold.Distance)+1);
         DCF.Lines = (byte) ((DCFold.Lines)+1);
         newValue = DCF;
   } else

   if (oldValue instanceof com.sun.star.text.TextContentAnchorType) {
         com.sun.star.text.TextContentAnchorType TCAT1 = com.sun.star.text.TextContentAnchorType.AS_CHARACTER;
         com.sun.star.text.TextContentAnchorType TCAT2 = com.sun.star.text.TextContentAnchorType.AT_CHARACTER;
         com.sun.star.text.TextContentAnchorType TCAT3 = com.sun.star.text.TextContentAnchorType.AT_FRAME;
         com.sun.star.text.TextContentAnchorType TCAT4 = com.sun.star.text.TextContentAnchorType.AT_PAGE;
         com.sun.star.text.TextContentAnchorType TCAT5 = com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH;
         if (oldValue.equals(TCAT1)) newValue = TCAT2;
         if (oldValue.equals(TCAT2)) newValue = TCAT3;
         if (oldValue.equals(TCAT3)) newValue = TCAT4;
         if (oldValue.equals(TCAT4)) newValue = TCAT5;
         if (oldValue.equals(TCAT5)) newValue = TCAT1;
   } else

   if (oldValue instanceof com.sun.star.text.WrapTextMode) {
         com.sun.star.text.WrapTextMode WTM1 = com.sun.star.text.WrapTextMode.DYNAMIC;
         com.sun.star.text.WrapTextMode WTM2 = com.sun.star.text.WrapTextMode.LEFT;
         com.sun.star.text.WrapTextMode WTM3 = com.sun.star.text.WrapTextMode.NONE;
         com.sun.star.text.WrapTextMode WTM4 = com.sun.star.text.WrapTextMode.PARALLEL;
         com.sun.star.text.WrapTextMode WTM5 = com.sun.star.text.WrapTextMode.RIGHT;
         com.sun.star.text.WrapTextMode WTM6 = com.sun.star.text.WrapTextMode.THROUGHT;
         if (oldValue.equals(WTM1)) newValue = WTM2;
         if (oldValue.equals(WTM2)) newValue = WTM3;
         if (oldValue.equals(WTM3)) newValue = WTM4;
         if (oldValue.equals(WTM4)) newValue = WTM5;
         if (oldValue.equals(WTM5)) newValue = WTM6;
         if (oldValue.equals(WTM6)) newValue = WTM1;
   } else

   if (oldValue instanceof com.sun.star.awt.Size) {
         com.sun.star.awt.Size oldSize = (com.sun.star.awt.Size) oldValue;
         com.sun.star.awt.Size newSize = new com.sun.star.awt.Size();
         newSize.Height = oldSize.Height +1;
         newSize.Width = oldSize.Width +1;
         newValue = newSize;
   } else

   if (oldValue instanceof com.sun.star.awt.Rectangle) {
         com.sun.star.awt.Rectangle oldRectangle = (com.sun.star.awt.Rectangle) oldValue;
         com.sun.star.awt.Rectangle newRectangle = new com.sun.star.awt.Rectangle();
         newRectangle.Height =oldRectangle.Height +1;
         newRectangle.Width = oldRectangle.Width +1;
         newRectangle.X =oldRectangle.Y +1;
         newRectangle.Y = oldRectangle.X +1;
         newValue = newRectangle;
   } else

   if (oldValue instanceof com.sun.star.awt.Point) {
         com.sun.star.awt.Point oldPoint = (com.sun.star.awt.Point) oldValue;
         com.sun.star.awt.Point newPoint = new com.sun.star.awt.Point();
         newPoint.X = oldPoint.X +1;
         newPoint.Y = oldPoint.Y +1;
         newValue = newPoint;
   } else

   if (oldValue instanceof com.sun.star.table.ShadowFormat) {
         com.sun.star.table.ShadowFormat SF = new com.sun.star.table.ShadowFormat();
         com.sun.star.table.ShadowFormat SFold = (com.sun.star.table.ShadowFormat) oldValue;
         SF.IsTransparent = (! SFold.IsTransparent);
         SF.ShadowWidth = (short) ((SFold.ShadowWidth)+1);
         newValue = SF;
   } else

   if (oldValue instanceof com.sun.star.awt.FontSlant) {
         com.sun.star.awt.FontSlant FS1 = com.sun.star.awt.FontSlant.DONTKNOW;
         com.sun.star.awt.FontSlant FS2 = com.sun.star.awt.FontSlant.ITALIC;
         com.sun.star.awt.FontSlant FS3 = com.sun.star.awt.FontSlant.NONE;
         com.sun.star.awt.FontSlant FS4 = com.sun.star.awt.FontSlant.OBLIQUE;
         com.sun.star.awt.FontSlant FS5 = com.sun.star.awt.FontSlant.REVERSE_ITALIC;
         com.sun.star.awt.FontSlant FS6 = com.sun.star.awt.FontSlant.REVERSE_OBLIQUE;
         if (oldValue.equals(FS1)) newValue = FS2;
         if (oldValue.equals(FS2)) newValue = FS3;
         if (oldValue.equals(FS3)) newValue = FS4;
         if (oldValue.equals(FS4)) newValue = FS5;
         if (oldValue.equals(FS5)) newValue = FS6;
         if (oldValue.equals(FS6)) newValue = FS1;
   } else

   if (oldValue instanceof com.sun.star.table.CellHoriJustify) {
         com.sun.star.table.CellHoriJustify CHJ1 = com.sun.star.table.CellHoriJustify.BLOCK;
         com.sun.star.table.CellHoriJustify CHJ2 = com.sun.star.table.CellHoriJustify.CENTER;
         com.sun.star.table.CellHoriJustify CHJ3 = com.sun.star.table.CellHoriJustify.LEFT;
         com.sun.star.table.CellHoriJustify CHJ4 = com.sun.star.table.CellHoriJustify.REPEAT;
         com.sun.star.table.CellHoriJustify CHJ5 = com.sun.star.table.CellHoriJustify.RIGHT;
         com.sun.star.table.CellHoriJustify CHJ6 = com.sun.star.table.CellHoriJustify.STANDARD;
         if (oldValue.equals(CHJ1)) newValue = CHJ2;
         if (oldValue.equals(CHJ2)) newValue = CHJ3;
         if (oldValue.equals(CHJ3)) newValue = CHJ4;
         if (oldValue.equals(CHJ4)) newValue = CHJ5;
         if (oldValue.equals(CHJ5)) newValue = CHJ6;
         if (oldValue.equals(CHJ6)) newValue = CHJ1;
   } else

   if (oldValue instanceof com.sun.star.table.CellVertJustify) {
         com.sun.star.table.CellVertJustify CVJ1 = com.sun.star.table.CellVertJustify.BOTTOM;
         com.sun.star.table.CellVertJustify CVJ2 = com.sun.star.table.CellVertJustify.CENTER;
         com.sun.star.table.CellVertJustify CVJ3 = com.sun.star.table.CellVertJustify.STANDARD;
         com.sun.star.table.CellVertJustify CVJ4 = com.sun.star.table.CellVertJustify.TOP;
         if (oldValue.equals(CVJ1)) newValue = CVJ2;
         if (oldValue.equals(CVJ2)) newValue = CVJ3;
         if (oldValue.equals(CVJ3)) newValue = CVJ4;
         if (oldValue.equals(CVJ4)) newValue = CVJ1;
   } else

   if (oldValue instanceof com.sun.star.table.CellOrientation) {
         com.sun.star.table.CellOrientation CO1 = com.sun.star.table.CellOrientation.BOTTOMTOP;
         com.sun.star.table.CellOrientation CO2 = com.sun.star.table.CellOrientation.STACKED;
         com.sun.star.table.CellOrientation CO3 = com.sun.star.table.CellOrientation.STANDARD;
         com.sun.star.table.CellOrientation CO4 = com.sun.star.table.CellOrientation.TOPBOTTOM;
         if (oldValue.equals(CO1)) newValue = CO2;
         if (oldValue.equals(CO2)) newValue = CO3;
         if (oldValue.equals(CO3)) newValue = CO4;
         if (oldValue.equals(CO4)) newValue = CO1;
   } else

   if (oldValue instanceof com.sun.star.util.CellProtection) {
         com.sun.star.util.CellProtection CP = new com.sun.star.util.CellProtection();
         com.sun.star.util.CellProtection CPold = (com.sun.star.util.CellProtection) oldValue;
         CP.IsFormulaHidden = (! CPold.IsFormulaHidden);
         CP.IsHidden = (! CPold.IsHidden);
         CP.IsLocked = (! CPold.IsLocked);
         CP.IsPrintHidden = (! CPold.IsPrintHidden);
         newValue = CP;
   } else

   if (oldValue instanceof com.sun.star.table.TableBorder) {
         com.sun.star.table.TableBorder TBold = (com.sun.star.table.TableBorder) oldValue;
         com.sun.star.table.TableBorder TB = new com.sun.star.table.TableBorder();
         TB.IsBottomLineValid = (! TBold.IsBottomLineValid);
         TB.IsDistanceValid = (! TBold.IsDistanceValid);
         TB.IsRightLineValid = (! TBold.IsRightLineValid);
         TB.IsTopLineValid = (! TBold.IsTopLineValid);
         newValue = TB;
   } else
/*
   if (oldValue instanceof com.sun.star.awt.XBitmap) {
        newValue = new BitmapLoader();
   }
*/
   if (oldValue instanceof com.sun.star.drawing.FillStyle) {
         com.sun.star.drawing.FillStyle FS1 = com.sun.star.drawing.FillStyle.NONE;
         com.sun.star.drawing.FillStyle FS2 = com.sun.star.drawing.FillStyle.SOLID;
         com.sun.star.drawing.FillStyle FS3 = com.sun.star.drawing.FillStyle.GRADIENT;
         com.sun.star.drawing.FillStyle FS4 = com.sun.star.drawing.FillStyle.HATCH;
         com.sun.star.drawing.FillStyle FS5 = com.sun.star.drawing.FillStyle.BITMAP;
         if (oldValue.equals(FS1)) newValue = FS2;
         if (oldValue.equals(FS2)) newValue = FS3;
         if (oldValue.equals(FS3)) newValue = FS4;
         if (oldValue.equals(FS4)) newValue = FS5;
         if (oldValue.equals(FS5)) newValue = FS1;
   } else

   if (oldValue instanceof com.sun.star.awt.Gradient){
        com.sun.star.awt.Gradient _newValue = (com.sun.star.awt.Gradient)oldValue;
        _newValue.Angle += 10;
        _newValue.Border += 1;
        _newValue.EndColor += 1000;
        _newValue.EndIntensity -= 10;
        _newValue.StartColor += 500;
        _newValue.StartIntensity += 10;
        _newValue.StepCount += 50;
        _newValue.Style = com.sun.star.awt.GradientStyle.RADIAL;
        _newValue.XOffset += 10;
        _newValue.YOffset += 10;
        newValue = _newValue;
   } else

   if (oldValue instanceof com.sun.star.text.GraphicCrop){
        com.sun.star.text.GraphicCrop _newValue = (com.sun.star.text.GraphicCrop)oldValue;
        _newValue.Bottom += 10;
        _newValue.Left += 10;
        _newValue.Right += 10;
        _newValue.Top += 10;
        newValue = _newValue;
   } else

   if (oldValue instanceof com.sun.star.drawing.BitmapMode){
        com.sun.star.drawing.BitmapMode bm1 = com.sun.star.drawing.BitmapMode.NO_REPEAT;
        com.sun.star.drawing.BitmapMode bm2 = com.sun.star.drawing.BitmapMode.REPEAT;
        com.sun.star.drawing.BitmapMode bm3 = com.sun.star.drawing.BitmapMode.STRETCH;
         if (oldValue.equals(bm1)) newValue = bm2;
         if (oldValue.equals(bm2)) newValue = bm3;
         if (oldValue.equals(bm3)) newValue = bm3;
   } else

   if (oldValue instanceof com.sun.star.drawing.TextAdjust){
        com.sun.star.drawing.TextAdjust TA1 = com.sun.star.drawing.TextAdjust.BLOCK;
        com.sun.star.drawing.TextAdjust TA2 = com.sun.star.drawing.TextAdjust.CENTER;
        com.sun.star.drawing.TextAdjust TA3 = com.sun.star.drawing.TextAdjust.LEFT;
        com.sun.star.drawing.TextAdjust TA4 = com.sun.star.drawing.TextAdjust.RIGHT;
        com.sun.star.drawing.TextAdjust TA5 = com.sun.star.drawing.TextAdjust.STRETCH;
        if (oldValue.equals(TA1)) newValue = TA2;
        if (oldValue.equals(TA2)) newValue = TA3;
        if (oldValue.equals(TA3)) newValue = TA4;
        if (oldValue.equals(TA4)) newValue = TA5;
        if (oldValue.equals(TA5)) newValue = TA1;
   } else
    if (oldValue instanceof com.sun.star.drawing.TextFitToSizeType){
        com.sun.star.drawing.TextFitToSizeType TF1 = com.sun.star.drawing.TextFitToSizeType.ALLLINES;
        com.sun.star.drawing.TextFitToSizeType TF2 = com.sun.star.drawing.TextFitToSizeType.NONE;
        com.sun.star.drawing.TextFitToSizeType TF3 = com.sun.star.drawing.TextFitToSizeType.PROPORTIONAL;
        com.sun.star.drawing.TextFitToSizeType TF4 = com.sun.star.drawing.TextFitToSizeType.RESIZEATTR;
        if (oldValue.equals(TF1)) newValue = TF2;
        if (oldValue.equals(TF2)) newValue = TF3;
        if (oldValue.equals(TF3)) newValue = TF4;
        if (oldValue.equals(TF4)) newValue = TF1;
    } else
    if (oldValue instanceof com.sun.star.drawing.TextAnimationKind){
        com.sun.star.drawing.TextAnimationKind AK1 = com.sun.star.drawing.TextAnimationKind.NONE;
        com.sun.star.drawing.TextAnimationKind AK2 = com.sun.star.drawing.TextAnimationKind.SLIDE;
        com.sun.star.drawing.TextAnimationKind AK3 = com.sun.star.drawing.TextAnimationKind.SCROLL;
        com.sun.star.drawing.TextAnimationKind AK4 = com.sun.star.drawing.TextAnimationKind.BLINK;
        com.sun.star.drawing.TextAnimationKind AK5 = com.sun.star.drawing.TextAnimationKind.ALTERNATE;

        if (oldValue.equals(AK1)) newValue = AK2;
        if (oldValue.equals(AK2)) newValue = AK3;
        if (oldValue.equals(AK3)) newValue = AK4;
        if (oldValue.equals(AK4)) newValue = AK5;
        if (oldValue.equals(AK5)) newValue = AK1;
    } else
    if (oldValue instanceof com.sun.star.drawing.TextAnimationDirection){
        com.sun.star.drawing.TextAnimationDirection AD1 = com.sun.star.drawing.TextAnimationDirection.LEFT;
        com.sun.star.drawing.TextAnimationDirection AD2 = com.sun.star.drawing.TextAnimationDirection.RIGHT;
        com.sun.star.drawing.TextAnimationDirection AD3 = com.sun.star.drawing.TextAnimationDirection.DOWN;
        com.sun.star.drawing.TextAnimationDirection AD4 = com.sun.star.drawing.TextAnimationDirection.UP;
        if (oldValue.equals(AD1)) newValue = AD2;
        if (oldValue.equals(AD2)) newValue = AD3;
        if (oldValue.equals(AD3)) newValue = AD4;
        if (oldValue.equals(AD4)) newValue = AD1;
    } else
    if (oldValue instanceof com.sun.star.drawing.LineStyle){
        com.sun.star.drawing.LineStyle LS1 = com.sun.star.drawing.LineStyle.NONE;
        com.sun.star.drawing.LineStyle LS2 = com.sun.star.drawing.LineStyle.DASH;
        com.sun.star.drawing.LineStyle LS3 = com.sun.star.drawing.LineStyle.SOLID;
        if (oldValue.equals(LS1)) newValue = LS2;
        if (oldValue.equals(LS2)) newValue = LS3;
        if (oldValue.equals(LS3)) newValue = LS1;
    } else
    if (oldValue instanceof com.sun.star.drawing.LineJoint){
        com.sun.star.drawing.LineJoint LJ1 = com.sun.star.drawing.LineJoint.BEVEL;
        com.sun.star.drawing.LineJoint LJ2 = com.sun.star.drawing.LineJoint.MIDDLE;
        com.sun.star.drawing.LineJoint LJ3 = com.sun.star.drawing.LineJoint.MITER;
        com.sun.star.drawing.LineJoint LJ4 = com.sun.star.drawing.LineJoint.NONE;
        com.sun.star.drawing.LineJoint LJ5 = com.sun.star.drawing.LineJoint.ROUND;
        if (oldValue.equals(LJ1)) newValue = LJ2;
        if (oldValue.equals(LJ2)) newValue = LJ3;
        if (oldValue.equals(LJ3)) newValue = LJ4;
        if (oldValue.equals(LJ4)) newValue = LJ5;
        if (oldValue.equals(LJ5)) newValue = LJ1;
    } else
    if (oldValue instanceof com.sun.star.drawing.LineDash){
        com.sun.star.drawing.LineDash _newValue = (com.sun.star.drawing.LineDash)oldValue;
        _newValue.Dashes += 1;
        _newValue.DashLen += 10;
        _newValue.Distance += 20;
        _newValue.DotLen += 10;
        _newValue.Dots += 10;
        _newValue.Style = com.sun.star.drawing.DashStyle.RECT;
        newValue = _newValue;
    } else
    if (oldValue instanceof com.sun.star.drawing.Hatch){
        com.sun.star.drawing.Hatch _newValue = (com.sun.star.drawing.Hatch) oldValue;
        _newValue.Angle += 10;
        _newValue.Color += 1000;
        _newValue.Distance += 10;
        _newValue.Style = com.sun.star.drawing.HatchStyle.DOUBLE;
    } else
    if (oldValue instanceof com.sun.star.drawing.RectanglePoint){
        com.sun.star.drawing.RectanglePoint RP1 = com.sun.star.drawing.RectanglePoint.LEFT_BOTTOM;
        com.sun.star.drawing.RectanglePoint RP2 = com.sun.star.drawing.RectanglePoint.LEFT_MIDDLE;
        com.sun.star.drawing.RectanglePoint RP3 = com.sun.star.drawing.RectanglePoint.LEFT_TOP;
        com.sun.star.drawing.RectanglePoint RP4 = com.sun.star.drawing.RectanglePoint.MIDDLE_BOTTOM;
        com.sun.star.drawing.RectanglePoint RP5 = com.sun.star.drawing.RectanglePoint.MIDDLE_MIDDLE;
        com.sun.star.drawing.RectanglePoint RP6 = com.sun.star.drawing.RectanglePoint.MIDDLE_TOP;
        com.sun.star.drawing.RectanglePoint RP7 = com.sun.star.drawing.RectanglePoint.RIGHT_BOTTOM;
        com.sun.star.drawing.RectanglePoint RP8 = com.sun.star.drawing.RectanglePoint.RIGHT_MIDDLE;
        com.sun.star.drawing.RectanglePoint RP9 = com.sun.star.drawing.RectanglePoint.RIGHT_TOP;

        if (oldValue.equals(RP1)) newValue = RP2;
        if (oldValue.equals(RP2)) newValue = RP3;
        if (oldValue.equals(RP3)) newValue = RP4;
        if (oldValue.equals(RP4)) newValue = RP5;
        if (oldValue.equals(RP5)) newValue = RP6;
        if (oldValue.equals(RP6)) newValue = RP7;
        if (oldValue.equals(RP7)) newValue = RP8;
        if (oldValue.equals(RP8)) newValue = RP9;
        if (oldValue.equals(RP9)) newValue = RP1;

    } else
    if (oldValue instanceof com.sun.star.chart.ChartErrorCategory){
        com.sun.star.chart.ChartErrorCategory CC1 = com.sun.star.chart.ChartErrorCategory.CONSTANT_VALUE;
        com.sun.star.chart.ChartErrorCategory CC2 = com.sun.star.chart.ChartErrorCategory.ERROR_MARGIN;
        com.sun.star.chart.ChartErrorCategory CC3 = com.sun.star.chart.ChartErrorCategory.NONE;
        com.sun.star.chart.ChartErrorCategory CC4 = com.sun.star.chart.ChartErrorCategory.PERCENT;
        com.sun.star.chart.ChartErrorCategory CC5 = com.sun.star.chart.ChartErrorCategory.STANDARD_DEVIATION;
        com.sun.star.chart.ChartErrorCategory CC6 = com.sun.star.chart.ChartErrorCategory.VARIANCE;
        if (oldValue.equals(CC1)) newValue = CC2;
        if (oldValue.equals(CC2)) newValue = CC3;
        if (oldValue.equals(CC3)) newValue = CC4;
        if (oldValue.equals(CC4)) newValue = CC5;
        if (oldValue.equals(CC5)) newValue = CC6;
        if (oldValue.equals(CC6)) newValue = CC1;
    } else
    if (oldValue instanceof com.sun.star.chart.ChartErrorIndicatorType){
        com.sun.star.chart.ChartErrorIndicatorType IT1 = com.sun.star.chart.ChartErrorIndicatorType.LOWER;
        com.sun.star.chart.ChartErrorIndicatorType IT2 = com.sun.star.chart.ChartErrorIndicatorType.NONE;
        com.sun.star.chart.ChartErrorIndicatorType IT3 = com.sun.star.chart.ChartErrorIndicatorType.TOP_AND_BOTTOM;
        com.sun.star.chart.ChartErrorIndicatorType IT4 = com.sun.star.chart.ChartErrorIndicatorType.UPPER;
        if (oldValue.equals(IT1)) newValue = IT2;
        if (oldValue.equals(IT2)) newValue = IT3;
        if (oldValue.equals(IT3)) newValue = IT4;
        if (oldValue.equals(IT4)) newValue = IT1;
    } else
    if (oldValue instanceof com.sun.star.chart.ChartRegressionCurveType){
        com.sun.star.chart.ChartRegressionCurveType CT1 = com.sun.star.chart.ChartRegressionCurveType.EXPONENTIAL;
        com.sun.star.chart.ChartRegressionCurveType CT2 = com.sun.star.chart.ChartRegressionCurveType.LINEAR;
        com.sun.star.chart.ChartRegressionCurveType CT3 = com.sun.star.chart.ChartRegressionCurveType.LOGARITHM;
        com.sun.star.chart.ChartRegressionCurveType CT4 = com.sun.star.chart.ChartRegressionCurveType.NONE;
        com.sun.star.chart.ChartRegressionCurveType CT5 = com.sun.star.chart.ChartRegressionCurveType.POLYNOMIAL;
        com.sun.star.chart.ChartRegressionCurveType CT6 = com.sun.star.chart.ChartRegressionCurveType.POWER;
        if (oldValue.equals(CT1)) newValue = CT2;
        if (oldValue.equals(CT2)) newValue = CT3;
        if (oldValue.equals(CT3)) newValue = CT4;
        if (oldValue.equals(CT4)) newValue = CT5;
        if (oldValue.equals(CT5)) newValue = CT6;
        if (oldValue.equals(CT6)) newValue = CT1;

    } else
    if (oldValue instanceof com.sun.star.chart.ChartDataRowSource){
        com.sun.star.chart.ChartDataRowSource RS1 = com.sun.star.chart.ChartDataRowSource.COLUMNS;
        com.sun.star.chart.ChartDataRowSource RS2 = com.sun.star.chart.ChartDataRowSource.ROWS;
        if (oldValue.equals(RS1)) newValue = RS2;
        if (oldValue.equals(RS2)) newValue = RS1;
    } else
    if (oldValue instanceof com.sun.star.awt.FontDescriptor){
        com.sun.star.awt.FontDescriptor _newValue = (com.sun.star.awt.FontDescriptor)oldValue;
        _newValue.CharacterWidth += 5;
        _newValue.CharSet = com.sun.star.awt.CharSet.ANSI;
        _newValue.Family = com.sun.star.awt.FontFamily.DECORATIVE;
        _newValue.Height += 2;
        _newValue.Kerning = !_newValue.Kerning;
        _newValue.Name = "Courier";
        _newValue.Orientation += 45;
        _newValue.Pitch = com.sun.star.awt.FontPitch.VARIABLE;
        _newValue.Slant = com.sun.star.awt.FontSlant.REVERSE_ITALIC;
        _newValue.Strikeout = com.sun.star.awt.FontStrikeout.X;
        _newValue.StyleName = "Bold";
        _newValue.Type = com.sun.star.awt.FontType.SCALABLE;
        _newValue.Underline = com.sun.star.awt.FontUnderline.BOLDDASHDOTDOT;
        _newValue.Weight += 5;
        _newValue.Width += 6;
        _newValue.WordLineMode = !_newValue.WordLineMode;

        newValue = _newValue;
    } else
    if (oldValue instanceof com.sun.star.form.NavigationBarMode){
        com.sun.star.form.NavigationBarMode BM1 = com.sun.star.form.NavigationBarMode.CURRENT;
        com.sun.star.form.NavigationBarMode BM2 = com.sun.star.form.NavigationBarMode.NONE;
        com.sun.star.form.NavigationBarMode BM3 = com.sun.star.form.NavigationBarMode.PARENT;
        if (oldValue.equals(BM1)) newValue = BM2;
        if (oldValue.equals(BM2)) newValue = BM3;
        if (oldValue.equals(BM3)) newValue = BM1;
    } else
    if (oldValue instanceof com.sun.star.form.FormSubmitEncoding){
        com.sun.star.form.FormSubmitEncoding SE1 = com.sun.star.form.FormSubmitEncoding.MULTIPART;
        com.sun.star.form.FormSubmitEncoding SE2 = com.sun.star.form.FormSubmitEncoding.TEXT;
        com.sun.star.form.FormSubmitEncoding SE3 = com.sun.star.form.FormSubmitEncoding.URL;
        if (oldValue.equals(SE1)) newValue = SE2;
        if (oldValue.equals(SE2)) newValue = SE3;
        if (oldValue.equals(SE3)) newValue = SE1;
    } else
    if (oldValue instanceof com.sun.star.form.FormSubmitMethod){
        com.sun.star.form.FormSubmitMethod FM1 = com.sun.star.form.FormSubmitMethod.GET;
        com.sun.star.form.FormSubmitMethod FM2 = com.sun.star.form.FormSubmitMethod.POST;
        if (oldValue.equals(FM1)) newValue = FM2;
        if (oldValue.equals(FM2)) newValue = FM1;
    } else

   if (oldValue instanceof com.sun.star.text.SectionFileLink){
        com.sun.star.text.SectionFileLink _newValue =
                                    new com.sun.star.text.SectionFileLink();

        _newValue.FileURL = util.utils.getFullTestURL("SwXTextSection.sdw");
        newValue=_newValue;
    } else

   if (oldValue instanceof com.sun.star.table.BorderLine){
        com.sun.star.table.BorderLine _newValue = (com.sun.star.table.BorderLine)oldValue;
    _newValue.Color += 2;
        _newValue.InnerLineWidth += 2;
        _newValue.LineDistance += 2;
        _newValue.OuterLineWidth += 3;
        newValue=_newValue;
    } else

   if (oldValue instanceof com.sun.star.text.XTextColumns){
        com.sun.star.text.XTextColumns _newValue = (com.sun.star.text.XTextColumns)oldValue;
    _newValue.setColumnCount((short)1);
        newValue=_newValue;
    } else

   if (oldValue instanceof com.sun.star.form.FormButtonType){
        com.sun.star.form.FormButtonType BT1 = com.sun.star.form.FormButtonType.PUSH;
        com.sun.star.form.FormButtonType BT2 = com.sun.star.form.FormButtonType.RESET;
        com.sun.star.form.FormButtonType BT3 = com.sun.star.form.FormButtonType.SUBMIT;
        com.sun.star.form.FormButtonType BT4 = com.sun.star.form.FormButtonType.URL;

        if (oldValue.equals(BT1)) newValue = BT2;
        if (oldValue.equals(BT2)) newValue = BT3;
        if (oldValue.equals(BT3)) newValue = BT4;
        if (oldValue.equals(BT4)) newValue = BT1;

   } else
   if (oldValue instanceof com.sun.star.form.ListSourceType){
        com.sun.star.form.ListSourceType ST1 = com.sun.star.form.ListSourceType.QUERY;
        com.sun.star.form.ListSourceType ST2 = com.sun.star.form.ListSourceType.SQL;
        com.sun.star.form.ListSourceType ST3 = com.sun.star.form.ListSourceType.SQLPASSTHROUGH;
        com.sun.star.form.ListSourceType ST4 = com.sun.star.form.ListSourceType.TABLE;
        com.sun.star.form.ListSourceType ST5 = com.sun.star.form.ListSourceType.TABLEFIELDS;
        com.sun.star.form.ListSourceType ST6 = com.sun.star.form.ListSourceType.VALUELIST;
        if (oldValue.equals(ST1)) newValue = ST2;
        if (oldValue.equals(ST2)) newValue = ST3;
        if (oldValue.equals(ST3)) newValue = ST4;
        if (oldValue.equals(ST4)) newValue = ST5;
        if (oldValue.equals(ST5)) newValue = ST6;
        if (oldValue.equals(ST6)) newValue = ST1;
   } else
   if (oldValue instanceof com.sun.star.table.BorderLine){
        com.sun.star.table.BorderLine _newValue = (com.sun.star.table.BorderLine)oldValue;
        _newValue.Color += 1000;
        _newValue.InnerLineWidth += 2;
        _newValue.LineDistance +=3;
        _newValue.OuterLineWidth += 3;
        newValue = _newValue;
   } else
   if (oldValue instanceof com.sun.star.sheet.DataPilotFieldOrientation) {
        com.sun.star.sheet.DataPilotFieldOrientation FO1 = com.sun.star.sheet.DataPilotFieldOrientation.PAGE;
        com.sun.star.sheet.DataPilotFieldOrientation FO2 = com.sun.star.sheet.DataPilotFieldOrientation.COLUMN;
        com.sun.star.sheet.DataPilotFieldOrientation FO3 = com.sun.star.sheet.DataPilotFieldOrientation.DATA;
        com.sun.star.sheet.DataPilotFieldOrientation FO4 = com.sun.star.sheet.DataPilotFieldOrientation.HIDDEN;
        com.sun.star.sheet.DataPilotFieldOrientation FO5 = com.sun.star.sheet.DataPilotFieldOrientation.ROW;
        if (oldValue.equals(FO1)) newValue = FO2;
        if (oldValue.equals(FO2)) newValue = FO3;
        if (oldValue.equals(FO3)) newValue = FO4;
        if (oldValue.equals(FO4)) newValue = FO5;
        if (oldValue.equals(FO5)) newValue = FO1;
   } else
   if (oldValue instanceof com.sun.star.sheet.GeneralFunction) {
        com.sun.star.sheet.GeneralFunction GF1 = com.sun.star.sheet.GeneralFunction.NONE;
        com.sun.star.sheet.GeneralFunction GF2 = com.sun.star.sheet.GeneralFunction.AVERAGE;
        com.sun.star.sheet.GeneralFunction GF3 = com.sun.star.sheet.GeneralFunction.COUNT;
        com.sun.star.sheet.GeneralFunction GF4 = com.sun.star.sheet.GeneralFunction.COUNTNUMS;
        com.sun.star.sheet.GeneralFunction GF5 = com.sun.star.sheet.GeneralFunction.MAX;
        com.sun.star.sheet.GeneralFunction GF6 = com.sun.star.sheet.GeneralFunction.MIN;
        com.sun.star.sheet.GeneralFunction GF7 = com.sun.star.sheet.GeneralFunction.AUTO;
        com.sun.star.sheet.GeneralFunction GF8 = com.sun.star.sheet.GeneralFunction.PRODUCT;
        com.sun.star.sheet.GeneralFunction GF9 = com.sun.star.sheet.GeneralFunction.STDEV;
        com.sun.star.sheet.GeneralFunction GF10 = com.sun.star.sheet.GeneralFunction.STDEVP;
        com.sun.star.sheet.GeneralFunction GF11 = com.sun.star.sheet.GeneralFunction.SUM;
        com.sun.star.sheet.GeneralFunction GF12 = com.sun.star.sheet.GeneralFunction.VAR;
        com.sun.star.sheet.GeneralFunction GF13 = com.sun.star.sheet.GeneralFunction.VARP;

        if (oldValue.equals(GF1)) newValue = GF2;
        if (oldValue.equals(GF2)) newValue = GF3;
        if (oldValue.equals(GF3)) newValue = GF4;
        if (oldValue.equals(GF4)) newValue = GF5;
        if (oldValue.equals(GF5)) newValue = GF6;
        if (oldValue.equals(GF6)) newValue = GF7;
        if (oldValue.equals(GF7)) newValue = GF8;
        if (oldValue.equals(GF8)) newValue = GF9;
        if (oldValue.equals(GF9)) newValue = GF10;
        if (oldValue.equals(GF10)) newValue = GF11;
        if (oldValue.equals(GF11)) newValue = GF12;
        if (oldValue.equals(GF12)) newValue = GF13;
        if (oldValue.equals(GF13)) newValue = GF1;
   } else

   if (oldValue instanceof com.sun.star.table.CellAddress){
        com.sun.star.table.CellAddress _newValue = (com.sun.star.table.CellAddress)oldValue;
        _newValue.Column += 1;
        _newValue.Row += 1;
        newValue = _newValue;
   } else

   if (oldValue instanceof com.sun.star.table.TableOrientation){
        com.sun.star.table.TableOrientation TO1 = com.sun.star.table.TableOrientation.COLUMNS;
        com.sun.star.table.TableOrientation TO2 = com.sun.star.table.TableOrientation.ROWS;
        if (oldValue.equals(TO1)) newValue = TO2; else newValue = TO1;
   } else

   if (oldValue instanceof com.sun.star.sheet.DataImportMode){
        com.sun.star.sheet.DataImportMode DIM1 = com.sun.star.sheet.DataImportMode.NONE;
        com.sun.star.sheet.DataImportMode DIM2 = com.sun.star.sheet.DataImportMode.QUERY;
        com.sun.star.sheet.DataImportMode DIM3 = com.sun.star.sheet.DataImportMode.SQL;
        com.sun.star.sheet.DataImportMode DIM4 = com.sun.star.sheet.DataImportMode.TABLE;

        if (oldValue.equals(DIM1)) newValue = DIM2;
        if (oldValue.equals(DIM2)) newValue = DIM3;
        if (oldValue.equals(DIM3)) newValue = DIM4;
        if (oldValue.equals(DIM4)) newValue = DIM1;

   } else

//   if (oldValue instanceof com.sun.star.text.TableColumnSeparator[]){
//        com.sun.star.text.TableColumnSeparator[] _newValue = (com.sun.star.text.TableColumnSeparator[]) oldValue;
//        com.sun.star.text.TableColumnSeparator sep = new com.sun.star.text.TableColumnSeparator();
//        sep.IsVisible = ! _newValue[0].IsVisible;
//        _newValue[0] = sep;
//        newValue = _newValue;
//   } else

   if (oldValue instanceof com.sun.star.style.BreakType){
        com.sun.star.style.BreakType BT1 = com.sun.star.style.BreakType.COLUMN_AFTER;
        com.sun.star.style.BreakType BT2 = com.sun.star.style.BreakType.COLUMN_BEFORE;
        com.sun.star.style.BreakType BT3 = com.sun.star.style.BreakType.COLUMN_BOTH;
        com.sun.star.style.BreakType BT4 = com.sun.star.style.BreakType.PAGE_AFTER;
        com.sun.star.style.BreakType BT5 = com.sun.star.style.BreakType.PAGE_BEFORE;
        com.sun.star.style.BreakType BT6 = com.sun.star.style.BreakType.PAGE_BOTH;
        com.sun.star.style.BreakType BT7 = com.sun.star.style.BreakType.NONE;
        if (oldValue.equals(BT1)) newValue = BT2;
        if (oldValue.equals(BT2)) newValue = BT3;
        if (oldValue.equals(BT3)) newValue = BT4;
        if (oldValue.equals(BT4)) newValue = BT5;
        if (oldValue.equals(BT6)) newValue = BT6;
        if (oldValue.equals(BT6)) newValue = BT7;
        if (oldValue.equals(BT7)) newValue = BT1;
   } else
    if (oldValue instanceof PropertyValue){
        PropertyValue newVal = new PropertyValue();
        newVal.Name = ((PropertyValue)oldValue).Name;
        newVal.Value = changePValue(((PropertyValue)oldValue).Value);
        newValue = newVal;
    } else   
   if (oldValue instanceof com.sun.star.sheet.ValidationAlertStyle){
        com.sun.star.sheet.ValidationAlertStyle VAS1 = com.sun.star.sheet.ValidationAlertStyle.INFO;
        com.sun.star.sheet.ValidationAlertStyle VAS2 = com.sun.star.sheet.ValidationAlertStyle.MACRO;
        com.sun.star.sheet.ValidationAlertStyle VAS3 = com.sun.star.sheet.ValidationAlertStyle.STOP;
        com.sun.star.sheet.ValidationAlertStyle VAS4 = com.sun.star.sheet.ValidationAlertStyle.WARNING;

        if (oldValue.equals(VAS1)) newValue = VAS2;
        if (oldValue.equals(VAS2)) newValue = VAS3;
        if (oldValue.equals(VAS3)) newValue = VAS4;
        if (oldValue.equals(VAS4)) newValue = VAS1;

   } else
    if (oldValue instanceof com.sun.star.sheet.ValidationType){
        com.sun.star.sheet.ValidationType VT1 = com.sun.star.sheet.ValidationType.ANY;
        com.sun.star.sheet.ValidationType VT2 = com.sun.star.sheet.ValidationType.CUSTOM;
        com.sun.star.sheet.ValidationType VT3 = com.sun.star.sheet.ValidationType.DATE;
        com.sun.star.sheet.ValidationType VT4 = com.sun.star.sheet.ValidationType.DECIMAL;
        com.sun.star.sheet.ValidationType VT5 = com.sun.star.sheet.ValidationType.LIST;
        com.sun.star.sheet.ValidationType VT6 = com.sun.star.sheet.ValidationType.TEXT_LEN;
        com.sun.star.sheet.ValidationType VT7 = com.sun.star.sheet.ValidationType.TIME;
        com.sun.star.sheet.ValidationType VT8 = com.sun.star.sheet.ValidationType.WHOLE;

        if (oldValue.equals(VT1)) newValue = VT2;
        if (oldValue.equals(VT2)) newValue = VT3;
        if (oldValue.equals(VT3)) newValue = VT4;
        if (oldValue.equals(VT4)) newValue = VT5;
        if (oldValue.equals(VT5)) newValue = VT6;
        if (oldValue.equals(VT6)) newValue = VT7;
        if (oldValue.equals(VT7)) newValue = VT8;
        if (oldValue.equals(VT8)) newValue = VT1;

    } else
    if (oldValue instanceof com.sun.star.text.WritingMode){
        if (oldValue.equals(com.sun.star.text.WritingMode.LR_TB)) {
            newValue = com.sun.star.text.WritingMode.TB_RL;
        } else {
            newValue = com.sun.star.text.WritingMode.LR_TB;
        }
    } else
    if (oldValue instanceof com.sun.star.uno.Enum) {
        // universal changer for Enumerations
        try {
            Class enumClass = oldValue.getClass() ;
            Field[] flds = enumClass.getFields() ;

            newValue = null ;

            for (int i = 0; i < flds.length; i++) {
                if (Enum.class.equals(flds[i].getType().getSuperclass())) {

                    Enum value = (Enum) flds[i].get(null) ;
                    if (newValue == null && !value.equals(oldValue)) {
                        newValue = value ;
                        break ;
                    }
                }
            }
        } catch (Exception e) {
            System.err.println("Exception occurred while changing Enumeration value:") ;
            e.printStackTrace(System.err) ;
        }
        if (newValue == null) newValue = oldValue ;

    } else
    if (oldValue instanceof com.sun.star.style.TabStop[]){
        com.sun.star.style.TabStop[] _newValue = (com.sun.star.style.TabStop[]) oldValue;
        if (_newValue.length == 0) {
            _newValue = new com.sun.star.style.TabStop[1];
        }
        com.sun.star.style.TabStop sep = new com.sun.star.style.TabStop();
        sep.Position += 1;
        _newValue[0] = sep;
        newValue = _newValue;
    } else
    if (oldValue instanceof short[]){
        short[] oldArr = (short[])oldValue;
        int len = oldArr.length;
        short[] newArr = new short[len + 1];
        for (int i = 0; i < len; i++) {
            newArr[i] = (short)(oldArr[i] + 1);
        }
        newArr[len] = 5;
        newValue = newArr;
    } else
    if (oldValue instanceof String[]){
        String[] oldArr = (String[])oldValue;
        int len = oldArr.length;
        String[] newArr = new String[len + 1];
        for (int i = 0; i < len; i++) {
            newArr[i] = "_" + oldArr[i];
        }
        newArr[len] = "_dummy";
        newValue = newArr;
    } else
    if (oldValue instanceof PropertyValue){
        PropertyValue newVal = new PropertyValue();
        newVal.Name = ((PropertyValue)oldValue).Name;
        newVal.Value = changePValue(((PropertyValue)oldValue).Value);
        newValue = newVal;
    } else
    if (oldValue instanceof com.sun.star.util.DateTime) {
        com.sun.star.util.DateTime oldDT = (com.sun.star.util.DateTime) oldValue;
        com.sun.star.util.DateTime newDT = new com.sun.star.util.DateTime();
        newDT.Day = (short) (oldDT.Day+(short) 1);
        newDT.Hours = (short) (oldDT.Hours+(short) 1);
        newValue = newDT;
    } else
    if (oldValue instanceof com.sun.star.text.TableColumnSeparator) {
        com.sun.star.text.TableColumnSeparator oldTCS = (com.sun.star.text.TableColumnSeparator) oldValue;
        com.sun.star.text.TableColumnSeparator newTCS = new com.sun.star.text.TableColumnSeparator();
        newTCS.IsVisible = !(oldTCS.IsVisible);
        newTCS.Position = (short) (oldTCS.Position+(short) 1);
        newValue = newTCS;
    } else
    if (oldValue instanceof com.sun.star.drawing.HomogenMatrix3) {
        com.sun.star.drawing.HomogenMatrix3 oldHM = (com.sun.star.drawing.HomogenMatrix3) oldValue;
        com.sun.star.drawing.HomogenMatrix3 newHM = new com.sun.star.drawing.HomogenMatrix3();
        newHM.Line1.Column1 = oldHM.Line1.Column1+1;
        newHM.Line2.Column2 = oldHM.Line2.Column2+1;
        newHM.Line3.Column3 = oldHM.Line3.Column3+1;
        newValue = newHM;
    } else

    if (oldValue instanceof com.sun.star.drawing.PolyPolygonBezierCoords) {
        com.sun.star.drawing.PolyPolygonBezierCoords oldPPC = (com.sun.star.drawing.PolyPolygonBezierCoords) oldValue;
        com.sun.star.drawing.PolyPolygonBezierCoords newPPC = new com.sun.star.drawing.PolyPolygonBezierCoords();
        newPPC.Coordinates = oldPPC.Coordinates;
        newPPC.Flags = oldPPC.Flags;
        PolygonFlags[][] fArray = new PolygonFlags[1][1];
        PolygonFlags[] flags = new PolygonFlags[1];
        flags[0] = PolygonFlags.NORMAL;
        fArray[0] = flags;
        Point[][] pArray = new Point[1][1];
        Point[] points = new Point[1];
        Point aPoint = new Point();
        aPoint.X = 1;
        aPoint.Y = 2;
        points[0] = aPoint;
        pArray[0] = points;
        if ( oldPPC.Coordinates.length == 0 ) {
            newPPC.Coordinates = pArray;
            newPPC.Flags = fArray;
        } else {
            if ( oldPPC.Coordinates[0].length == 0 ) {
                newPPC.Coordinates = pArray;
                newPPC.Flags = fArray;                
            } else {
                newPPC.Coordinates[0][0].X = oldPPC.Coordinates[0][0].X +1;
                newPPC.Coordinates[0][0].Y = oldPPC.Coordinates[0][0].Y +1;
            }
        }
        newValue = newPPC;
    } else
    if (oldValue.getClass().isArray()) {
        // changer for arrays : changes all elements
        Class arrType = oldValue.getClass().getComponentType() ;
        newValue = Array.newInstance(arrType, Array.getLength(oldValue)) ;
        for (int i = 0; i < Array.getLength(newValue); i++) {
            if (!arrType.isPrimitive()) {
                Object elem = changePValue(Array.get(oldValue, i)) ;
                Array.set(newValue, i, elem);
            } else {
                if (Boolean.TYPE.equals(arrType)) {
                    Array.setBoolean(newValue, i, !Array.getBoolean(oldValue, i));
                } else
                if (Byte.TYPE.equals(arrType)) {
                    Array.setByte(newValue, i,
                        (byte) (Array.getByte(oldValue, i) + 1));
                } else
                if (Character.TYPE.equals(arrType)) {
                    Array.setChar(newValue, i,
                        (char) (Array.getChar(oldValue, i) + 1));
                } else
                if (Double.TYPE.equals(arrType)) {
                    Array.setDouble(newValue, i, Array.getDouble(oldValue, i) + 1);
                } else
                if (Float.TYPE.equals(arrType)) {
                    Array.setFloat(newValue, i, Array.getFloat(oldValue, i) + 1);
                } else
                if (Integer.TYPE.equals(arrType)) {
                    Array.setInt(newValue, i, Array.getInt(oldValue, i) + 1);
                } else
                if (Long.TYPE.equals(arrType)) {
                    Array.setLong(newValue, i, Array.getLong(oldValue, i) + 1);
                } else
                if (Short.TYPE.equals(arrType)) {
                    Array.setShort(newValue, i,
                        (short) (Array.getShort(oldValue, i) + 1));
                }
            }
        }
    } else
    if (isStructure(oldValue)) {
        // universal changer for structures
        Class clazz = oldValue.getClass() ;
        try {
            newValue = clazz.newInstance() ;
            Field[] fields = clazz.getFields();
            for (int i = 0; i < fields.length; i++) {
                if ((fields[i].getModifiers() & Modifier.PUBLIC) != 0) {
                    Class fType = fields[i].getType() ;
                    Field field = fields[i] ;
                    if (!fType.isPrimitive()) {
                        field.set(newValue, changePValue(field.get(oldValue)));
                    } else {
                        if (Boolean.TYPE.equals(fType)) {
                            field.setBoolean(newValue, !field.getBoolean(oldValue));
                        } else
                        if (Byte.TYPE.equals(fType)) {
                            field.setByte(newValue, (byte) (field.getByte(oldValue) + 1));
                        } else
                        if (Character.TYPE.equals(fType)) {
                            field.setChar(newValue, (char) (field.getChar(oldValue) + 1));
                        } else
                        if (Double.TYPE.equals(fType)) {
                            field.setDouble(newValue, field.getDouble(oldValue) + 1);
                        } else
                        if (Float.TYPE.equals(fType)) {
                            field.setFloat(newValue, field.getFloat(oldValue) + 1);
                        } else
                        if (Integer.TYPE.equals(fType)) {
                            field.setInt(newValue, field.getInt(oldValue) + 1);
                        } else
                        if (Long.TYPE.equals(fType)) {
                            field.setLong(newValue, field.getLong(oldValue) + 1);
                        } else
                        if (Short.TYPE.equals(fType)) {
                            field.setShort(newValue, (short) (field.getShort(oldValue) + 1));
                        }
                    }
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace() ;
        } catch (InstantiationException e) {
            e.printStackTrace() ;
        }

    } else
    {
        System.out.println("ValueChanger don't know type " + oldValue.getClass());
    }

   return newValue;

 } // end of Change PValue

 /**
  * Checks if the passed value is the API structure.
  * The value assumed to be a structure if there are no public
  * methods, and all public fields are not static or final.
  *
  * @param val the value to be checked.
  * @return <code>true</code> if the value is acssumed to be a
  * structure.
  */
 private static boolean isStructure(Object val) {
    boolean result = true ;

    Class clazz = val.getClass() ;

    Method[] meth = clazz.getDeclaredMethods() ;
    for (int i = 0; i < meth.length; i++) {
        result &= (meth[i].getModifiers() & Modifier.PUBLIC) == 0 ;
    }

    Field[] fields = clazz.getDeclaredFields() ;
    for (int i = 0; i < fields.length; i++) {
        int mod = fields[i].getModifiers() ;
        // If the field is PUBLIC it must not be STATIC or FINAL
        result &= ((mod & Modifier.PUBLIC) == 0) ||
            (((mod & Modifier.STATIC) == 0) && ((mod & Modifier.FINAL) == 0)) ;
    }

    return result ;
 }
}
