blob: 1f02c8ec78d5b4a53a94bddd1887e575ca43c142 [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.ui;
import com.sun.star.beans.*;
import com.sun.star.awt.*;
import com.sun.star.lang.XMultiServiceFactory;
import com.sun.star.wizards.common.*;
import com.sun.star.wizards.common.HelpIds;
import java.util.*;
public abstract class ControlScroller
{
protected WizardDialog CurUnoDialog;
protected XMultiServiceFactory xMSF;
private Object oImgControl;
protected int ncurfieldcount;
protected int nblockincrement;
private int nlineincrement;
protected int nscrollvalue = 0;
protected int ntotfieldcount;
XScrollBar xScrollBar;
protected Vector scrollfields;
protected Integer ICompPosX;
protected int iCompPosX;
protected Integer ICompPosY;
protected int iCompPosY;
protected Integer ICompWidth;
protected int iCompWidth;
protected Integer ICompHeight;
protected int iCompHeight;
protected int iStartPosY;
protected short curtabindex;
int iStep;
protected Integer IStep;
protected int linedistance;
int iScrollBarWidth = 10;
int SORELFIRSTPOSY = 3;
protected int curHelpIndex;
String sIncSuffix;
protected Vector ControlGroupVector = new Vector();
protected PeerConfig oTitlePeerConfig;
class AdjustmentListenerImpl implements com.sun.star.awt.XAdjustmentListener
{
public void disposing(com.sun.star.lang.EventObject eventObject)
{
}
public void adjustmentValueChanged(AdjustmentEvent AdjustEvent)
{
scrollControls();
}
}
/**
*
* @param _CurUnoDialog
* @param iStep
* @param iCompPosX
* @param iCompPosY
* @param iCompWidth
* @param _nblockincrement
* @param _firsthelpindex
* @author bc93774
*/
// TODO add parameters for tabindices and helpindex
protected ControlScroller(WizardDialog _CurUnoDialog, XMultiServiceFactory _xMSF, int _iStep, int _iCompPosX, int _iCompPosY, int _iCompWidth, int _nblockincrement, int _nlinedistance, int _firsthelpindex)
{
this.xMSF = _xMSF;
this.nblockincrement = _nblockincrement;
this.CurUnoDialog = _CurUnoDialog;
this.iStep = _iStep;
this.curHelpIndex = _firsthelpindex;
curtabindex = UnoDialog.setInitialTabindex(iStep);
this.linedistance = _nlinedistance;
IStep = new Integer(iStep);
this.iCompPosX = _iCompPosX;
this.iCompPosY = _iCompPosY;
this.ICompPosX = new Integer(iCompPosX);
this.ICompPosY = new Integer(iCompPosY);
this.iCompWidth = _iCompWidth;
this.ICompWidth = new Integer(iCompWidth);
this.iCompHeight = 2 * SORELFIRSTPOSY + nblockincrement * linedistance;
iStartPosY = iCompPosY + SORELFIRSTPOSY;
int ScrollHeight = iCompHeight - 2;
nlineincrement = 1;
sIncSuffix = com.sun.star.wizards.common.Desktop.getIncrementSuffix(CurUnoDialog.getDlgNameAccess(), "imgBackground");
oImgControl = CurUnoDialog.insertControlModel("com.sun.star.awt.UnoControlImageControlModel", "imgBackground" + sIncSuffix,
new String[]
{
PropertyNames.PROPERTY_BORDER, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH
},
new Object[]
{
new Short("1"), new Integer(iCompHeight), ICompPosX, new Integer(iCompPosY), IStep, ICompWidth
});
oImgControl = CurUnoDialog.xDlgContainer.getControl("imgBackground" + sIncSuffix);
setComponentMouseTransparent();
xScrollBar = CurUnoDialog.insertScrollBar("TitleScrollBar" + sIncSuffix, 0,
new AdjustmentListenerImpl(),
new String[]
{
PropertyNames.PROPERTY_BORDER, PropertyNames.PROPERTY_ENABLED, PropertyNames.PROPERTY_HEIGHT, PropertyNames.PROPERTY_HELPURL, PropertyNames.ORIENTATION, PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP, PropertyNames.PROPERTY_WIDTH
},
new Object[]
{
new Short((short) 0), Boolean.TRUE, new Integer(ScrollHeight), HelpIds.getHelpIdString(curHelpIndex), new Integer(ScrollBarOrientation.VERTICAL), new Integer(iCompPosX + iCompWidth - iScrollBarWidth - 1), new Integer(iCompPosY + 1), IStep, new Integer(iScrollBarWidth)
});
scrollfields = new Vector();
int ypos = iStartPosY + SORELFIRSTPOSY;
for (int i = 0; i < nblockincrement; i++)
{
insertControlGroup(i, ypos);
ypos += linedistance;
}
}
public void setComponentMouseTransparent()
{
CurUnoDialog.getPeerConfiguration().setPeerProperties(oImgControl, new String[]
{
"MouseTransparent"
}, new Boolean[]
{
Boolean.TRUE
});
}
protected void setScrollBarOrientationHorizontal()
{
Helper.setUnoPropertyValue(xScrollBar, PropertyNames.ORIENTATION, new Integer(ScrollBarOrientation.HORIZONTAL));
}
/**
* @author bc93774
* @param _ntotfieldcount: The number of fields that are to be administered by the ControlScroller
*/
protected void initialize(int _ntotfieldcount)
{
try
{
boolean bisVisible;
ntotfieldcount = _ntotfieldcount;
setCurFieldCount();
nscrollvalue = 0;
Helper.setUnoPropertyValue(UnoDialog.getModel(xScrollBar), "ScrollValue", new Integer(nscrollvalue));
if (ntotfieldcount > nblockincrement)
{
Helper.setUnoPropertyValues(UnoDialog.getModel(xScrollBar), new String[]
{
PropertyNames.PROPERTY_ENABLED, "BlockIncrement", "LineIncrement", "ScrollValue", "ScrollValueMax"
}, new Object[]
{
Boolean.TRUE, new Integer(nblockincrement), new Integer(nlineincrement), new Integer(nscrollvalue), new Integer(ntotfieldcount - nblockincrement)
});
}
else
{
Helper.setUnoPropertyValues(UnoDialog.getModel(xScrollBar), new String[]
{
PropertyNames.PROPERTY_ENABLED, "ScrollValue"
}, new Object[]
{
Boolean.FALSE, new Integer(nscrollvalue)
});
}
fillupControls(true);
}
catch (java.lang.Exception ex)
{
ex.printStackTrace();
}
}
protected void fillupControls(boolean binitialize)
{
int newindex;
PropertyValue[] oldproperties;
PropertyValue[] newproperties;
for (int a = 0; a < this.nblockincrement; a++)
{
if (a < ncurfieldcount)
{
fillupControls(a);
}
if (binitialize)
{
setControlGroupVisible(a, (a < this.ncurfieldcount));
}
}
if (binitialize)
{
CurUnoDialog.repaintDialogStep();
}
}
protected void fillupControls(int guiRow)
{
PropertyValue[] nameProps = (PropertyValue[]) scrollfields.get(guiRow);
PropertyValue[] valueProps = (PropertyValue[]) scrollfields.get(guiRow + nscrollvalue);
for (int n = 0; n < nameProps.length; n++)
{
if (CurUnoDialog.getDlgNameAccess().hasByName(nameProps[n].Name))
{
setControlData(nameProps[n].Name, valueProps[n].Value);
}
else
{
throw new IllegalArgumentException("No such control !");
}
}
}
protected void setScrollValue(int _nscrollvalue)
{
if (_nscrollvalue >= 0)
{
Helper.setUnoPropertyValue(UnoDialog.getModel(xScrollBar), "ScrollValue", new Integer(_nscrollvalue));
scrollControls();
}
}
protected void setScrollValue(int _nscrollvalue, int _ntotfieldcount)
{
setTotalFieldCount(_ntotfieldcount);
setScrollValue(_nscrollvalue);
}
protected int getTotalFieldCount()
{
return ntotfieldcount;
}
protected int getCurFieldCount()
{
return ncurfieldcount;
}
private void setCurFieldCount()
{
if (ntotfieldcount > nblockincrement)
{
ncurfieldcount = nblockincrement;
}
else
{
ncurfieldcount = ntotfieldcount;
}
}
protected void setTotalFieldCount(int _ntotfieldcount)
{
this.ntotfieldcount = _ntotfieldcount;
setCurFieldCount();
if (ntotfieldcount > nblockincrement)
{
Helper.setUnoPropertyValues(UnoDialog.getModel(xScrollBar), new String[]
{
PropertyNames.PROPERTY_ENABLED, "ScrollValueMax"
}, new Object[]
{
Boolean.TRUE, new Integer(ntotfieldcount - nblockincrement)
});
}
else
{
Helper.setUnoPropertyValue(UnoDialog.getModel(xScrollBar), PropertyNames.PROPERTY_ENABLED, Boolean.FALSE);
}
}
protected void toggleComponent(boolean _bdoenable)
{
boolean bdoenable = _bdoenable && (ntotfieldcount > nblockincrement);
CurUnoDialog.setControlProperty("TitleScrollBar" + sIncSuffix, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(bdoenable));
}
protected void toggleControls(boolean _bdoenable)
{
for (int n = 0; n < scrollfields.size(); n++)
{
PropertyValue[] curproperties = (PropertyValue[]) scrollfields.elementAt(n);
for (int m = 0; m < curproperties.length; m++)
{
PropertyValue curproperty = curproperties[m];
CurUnoDialog.setControlProperty(curproperty.Name, PropertyNames.PROPERTY_ENABLED, Boolean.valueOf(_bdoenable));
}
}
}
protected int getScrollValue()
{
return nscrollvalue;
}
protected void setLineIncrementation(int _nlineincrement)
{
this.nlineincrement = _nlineincrement;
Helper.setUnoPropertyValue(UnoDialog.getModel(xScrollBar), "LineIncrement", new Integer(nlineincrement));
}
protected int getLineIncrementation()
{
return nlineincrement;
}
protected void setBlockIncrementation(int _nblockincrement)
{
this.nblockincrement = _nblockincrement;
Helper.setUnoPropertyValues(UnoDialog.getModel(xScrollBar), new String[]
{
PropertyNames.PROPERTY_ENABLED, "BlockIncrement", "ScrollValueMax"
}, new Object[]
{
Boolean.valueOf(ntotfieldcount > nblockincrement), new Integer(nblockincrement), new Integer(ntotfieldcount - nblockincrement)
});
}
protected int getBlockIncrementation()
{
return nblockincrement;
}
private void scrollControls()
{
try
{
scrollRowsInfo();
nscrollvalue = ((Integer) Helper.getUnoPropertyValue(UnoDialog.getModel(xScrollBar), "ScrollValue")).intValue();
if (nscrollvalue + nblockincrement >= ntotfieldcount)
{
nscrollvalue = (ntotfieldcount) - nblockincrement;
}
fillupControls(false);
}
catch (java.lang.Exception ex)
{
ex.printStackTrace();
}
}
protected void scrollRowsInfo()
{
int cols =
scrollfields.size() > 0
? ((PropertyValue[]) scrollfields.get(0)).length
: 0;
for (int a = 0; a < ncurfieldcount; a++)
{
for (int n = 0; n < cols; n++)
{
fieldInfo(a, n);
}
}
}
/**
* updates the corresponding data to
* the control in guiRow and column
* @param guiRow 0 based row index
* @param column 0 based column index
* @return the propertyValue object corresponding to
* this control.
*/
protected PropertyValue fieldInfo(int guiRow, int column)
{
if (guiRow + nscrollvalue < scrollfields.size())
{
return fieldInfo(
((PropertyValue[]) scrollfields.elementAt(guiRow + nscrollvalue))[column],
((PropertyValue[]) scrollfields.elementAt(guiRow))[column]);
//System.out.println("getting field info for : " + guiRow + "/" + column + ":" + pv.Value + "(" + pv.Name + ")" );
}
else
{
return null;
}
}
protected PropertyValue fieldInfo(PropertyValue valueProp, PropertyValue nameProp)
{
if (CurUnoDialog.getDlgNameAccess().hasByName(nameProp.Name))
{
valueProp.Value = getControlData(nameProp.Name);
}
else
{
valueProp.Value = nameProp.Value;
}
return valueProp;
}
protected void unregisterControlGroup(int _index)
{
scrollfields.remove(_index);
}
protected void registerControlGroup(PropertyValue[] _currowproperties, int _i)
{
if (_i == 0)
{
scrollfields.removeAllElements();
}
if (_i >= scrollfields.size())
{
scrollfields.addElement(_currowproperties);
}
else
{
scrollfields.setElementAt(_currowproperties, _i);
}
}
protected PropertyValue[] getControlGroupInfo(int _i)
{
return (PropertyValue[]) scrollfields.elementAt(_i);
}
protected void setControlData(String controlname, Object newvalue)
{
Object oControlModel = UnoDialog.getModel(CurUnoDialog.xDlgContainer.getControl(controlname));
String propertyname = UnoDialog.getDisplayProperty(oControlModel);
if (!propertyname.equals(PropertyNames.EMPTY_STRING))
{
CurUnoDialog.setControlProperty(controlname, propertyname, newvalue);
}
}
protected Object getControlData(String controlname)
{
Object oControlModel = UnoDialog.getModel(CurUnoDialog.xDlgContainer.getControl(controlname));
String propertyname = UnoDialog.getDisplayProperty(oControlModel);
if (!propertyname.equals(PropertyNames.EMPTY_STRING))
{
return CurUnoDialog.getControlProperty(controlname, propertyname);
}
else
{
return null;
}
}
protected PropertyValue[][] getScrollFieldValues()
{
scrollRowsInfo();
PropertyValue[] curproperties;
PropertyValue[][] retproperties;
retproperties = new PropertyValue[scrollfields.size()][];
try
{
for (int i = 0; i < scrollfields.size(); i++)
{
curproperties = (PropertyValue[]) scrollfields.elementAt(i);
retproperties[i] = curproperties;
}
return retproperties;
}
catch (java.lang.Exception ex)
{
ex.printStackTrace(System.out);
return null;
}
}
protected abstract void initializeScrollFields();
/** inserts a group of controls into the component. The group may either be a row or a column of controls
* The controls should be put on Step 99 (means made invisible at first). All the controlrows that are needed are than
* made visible automatically when calling "initialize(_fieldcount)"
* @author bc93774
* @param i: The index of the control group
* @param npos: Can be an x coordinate or an y coordinate which depends on the orientation of the scrollbar
*/
protected abstract void insertControlGroup(int _index, int npos);
protected abstract void setControlGroupVisible(int _index, boolean _bIsVisible);
}