blob: c52b4d7744d5d5c5a3a646add09d64339ca3fec5 [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.awt.Size;
import com.sun.star.awt.XActionListener;
import com.sun.star.awt.XButton;
import com.sun.star.awt.XControl;
import com.sun.star.awt.XControlModel;
import com.sun.star.awt.XFixedText;
import com.sun.star.awt.XItemEventBroadcaster;
import com.sun.star.awt.XItemListener;
import com.sun.star.awt.XWindow;
import com.sun.star.lang.EventObject;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.wizards.common.Helper;
import com.sun.star.wizards.common.IRenderer;
import com.sun.star.wizards.common.PropertySetHelper;
import com.sun.star.wizards.common.PropertyNames;
import javax.swing.ListModel;
import javax.swing.event.ListDataEvent;
import com.sun.star.wizards.common.HelpIds;
import com.sun.star.wizards.common.PropertyNames;
/**
*
* @author rpiterman,ll93751
*/
public class ButtonList implements XItemEventBroadcaster, XActionListener
{
private XFixedText lblImageText;
private XButton btnBack;
private XButton btnNext;
private XFixedText lblCounter;
private XControl m_aButtons[];
private boolean benabled = true;
private UnoDialog2 oUnoDialog;
private Size gap = new Size(4, 4);
private int cols = 4;
private int rows = 3;
private Size m_aButtonSize = new Size(20, 20);
private Size pos;
private Size selectionGap = new Size(2, 2);
private boolean showButtons = true;
private Short step;
private boolean refreshOverNull = true;
private int imageTextLines = 1;
private boolean rowSelect = false;
public int tabIndex;
public Boolean scaleImages = Boolean.TRUE;
private String m_aControlName = "il";
private int m_nCurrentSelection = -1;
private int pageStart = 0;
public int helpURL = 0;
private IImageRenderer renderer;
private ListModel listModel;
public IRenderer counterRenderer = new SimpleCounterRenderer();
private final static int LINE_HEIGHT = 8; //private MethodInvocation METHOD_MOUSE_ENTER_IMAGE;
/** Getter for property m_aButtonSize.
* @return Value of property m_aButtonSize.
*
*/
public Size getButtonSize()
{
return this.m_aButtonSize;
}
public void setName(String _sName)
{
m_aControlName = _sName;
}
/** Setter for property m_aButtonSize.
* @param imageSize New value of property m_aButtonSize.
*/
public void setButtonSize(Size imageSize)
{
this.m_aButtonSize = imageSize;
}
// @Override
public void disposing(EventObject arg0)
{
// throw new UnsupportedOperationException("Not supported yet.");
}
public void create(UnoDialog2 dialog)
{
oUnoDialog = dialog;
int imageTextHeight = imageTextLines * LINE_HEIGHT;
int nXPos = pos.Width + 1;
int nYPos = pos.Height + (m_aButtonSize.Height + gap.Height) * rows + gap.Height;
int nWidth = cols * (m_aButtonSize.Width + gap.Width) + gap.Width - 2;
lblImageText = dialog.insertLabel(m_aControlName + "_imageText",
new String[]
{
PropertyNames.PROPERTY_HEIGHT,
PropertyNames.PROPERTY_HELPURL,
PropertyNames.PROPERTY_LABEL,
PropertyNames.PROPERTY_POSITION_X,
PropertyNames.PROPERTY_POSITION_Y,
PropertyNames.PROPERTY_STEP,
PropertyNames.PROPERTY_TABINDEX,
"Tabstop",
PropertyNames.PROPERTY_WIDTH
},
new Object[]
{
Integer.valueOf(imageTextHeight),
PropertyNames.EMPTY_STRING,
"(1)",
Integer.valueOf(nXPos),
Integer.valueOf(nYPos),
step,
Short.valueOf((short) 0),
Boolean.FALSE,
Integer.valueOf(nWidth)
});
if (showButtons)
{
final String[] pNames1 = new String[]
{
PropertyNames.PROPERTY_HEIGHT,
PropertyNames.PROPERTY_HELPURL,
PropertyNames.PROPERTY_POSITION_X,
PropertyNames.PROPERTY_POSITION_Y,
PropertyNames.PROPERTY_STEP,
PropertyNames.PROPERTY_TABINDEX,
"Tabstop",
PropertyNames.PROPERTY_WIDTH
};
final Integer btnSize = Integer.valueOf(14);
// TODO: if list of strings not the same length of list object, office will die.
btnBack = dialog.insertButton(m_aControlName + "_btnBack", "prevPage", this, pNames1, new Object[]
{
btnSize,
HelpIds.getHelpIdString(helpURL++),
Integer.valueOf(pos.Width),
Integer.valueOf(pos.Height + (m_aButtonSize.Height + gap.Height) * rows + gap.Height + imageTextHeight + 1),
step,
Short.valueOf((short) (tabIndex + 1)),
Boolean.TRUE,
btnSize
});
btnNext = dialog.insertButton(m_aControlName + "_btnNext", "nextPage", this, pNames1, new Object[]
{
btnSize,
HelpIds.getHelpIdString(helpURL++),
Integer.valueOf(pos.Width + (m_aButtonSize.Width + gap.Width) * cols + gap.Width - btnSize.intValue() + 1),
Integer.valueOf(pos.Height + (m_aButtonSize.Height + gap.Height) * rows + gap.Height + imageTextHeight + 1),
step,
new Short((short) (tabIndex + 2)),
Boolean.TRUE,
btnSize
});
lblCounter = dialog.insertLabel(m_aControlName + "_lblCounter", pNames1, new Object[]
{
Integer.valueOf(LINE_HEIGHT),
PropertyNames.EMPTY_STRING,
Integer.valueOf(pos.Width + btnSize.intValue() + 1),
Integer.valueOf(pos.Height + (m_aButtonSize.Height + gap.Height) * rows + gap.Height + imageTextHeight + ((btnSize.intValue() - LINE_HEIGHT) / 2)),
step,
Short.valueOf((short) 0),
Boolean.FALSE,
Integer.valueOf(cols * (m_aButtonSize.Width + gap.Width) + gap.Width - 2 * btnSize.intValue() - 1)
});
Helper.setUnoPropertyValue(getModel(lblCounter), PropertyNames.PROPERTY_ALIGN, new Short((short) 1));
Helper.setUnoPropertyValue(getModel(btnBack), PropertyNames.PROPERTY_LABEL, "<");
Helper.setUnoPropertyValue(getModel(btnNext), PropertyNames.PROPERTY_LABEL, ">");
}
m_tabIndex = new Short((short) tabIndex);
m_aButtons = new XControl[rows * cols];
m_aButtonHeight = Integer.valueOf(m_aButtonSize.Height);
m_aButtonWidth = Integer.valueOf(m_aButtonSize.Width);
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < cols; c++)
{
XButton aButton = createButton(dialog, r, c);
XControl aControl = UnoRuntime.queryInterface(XControl.class, aButton);
m_aButtons[r * cols + c] = aControl;
}
}
refreshImages();
}
private Integer m_aButtonHeight;
private Integer m_aButtonWidth;
private Short m_tabIndex;
private XButton createButton(UnoDialog2 dialog, int _row, int _col)
{
String sButtonName = m_aControlName + "_button" + (_row * cols + _col);
int nButtonX = getButtonPosX(_col);
int nButtonY = getButtonPosY(_row);
XButton aButton = dialog.insertImageButton(sButtonName, this,
new String[]
{
/* PropertyNames.PROPERTY_BORDER, */
/* "BackgroundColor", */
PropertyNames.PROPERTY_HEIGHT,
PropertyNames.PROPERTY_HELPURL,
/* PropertyNames.PROPERTY_LABEL, */
PropertyNames.PROPERTY_POSITION_X,
PropertyNames.PROPERTY_POSITION_Y,
/* "ScaleImage", */
PropertyNames.PROPERTY_STEP,
PropertyNames.PROPERTY_TABINDEX,
"Tabstop",
"Toggle",
PropertyNames.PROPERTY_WIDTH
},
new Object[]
{
/* Short.valueOf((short) 1), */ /* NO_BORDER, */
/* BACKGROUND_COLOR, */
m_aButtonHeight,
HelpIds.getHelpIdString(helpURL++),
/* "Test", */
Integer.valueOf(nButtonX),
Integer.valueOf(nButtonY),
/* scaleImages, */
step,
m_tabIndex,
Boolean.TRUE,
Boolean.TRUE, /* Toggle */
m_aButtonWidth
});
XWindow win = UnoRuntime.queryInterface(XWindow.class, aButton);
win.setEnable(true);
win.setVisible(true);
return aButton;
}
private int getButtonPosX(int _col)
{
return pos.Width + _col * (m_aButtonSize.Width + gap.Width) + gap.Width;
}
private int getButtonPosY(int _row)
{
return pos.Height + _row * (m_aButtonSize.Height + gap.Height) + gap.Height;
}
private void refreshImages()
{
if (showButtons)
{
refreshCounterText();
}
if (refreshOverNull)
{
for (int i = 0; i < m_aButtons.length; i++)
{
setVisible(m_aButtons[i], false);
}
}
boolean focusable = true;
for (int i = 0; i < m_aButtons.length; i++)
{
Object[] oResources = renderer.getImageUrls(getObjectFor(i));
if (oResources != null)
{
if (oResources.length == 1)
{
Helper.setUnoPropertyValue(m_aButtons[i].getModel(), PropertyNames.PROPERTY_IMAGEURL, oResources[0]);
}
else if (oResources.length == 2)
{
oUnoDialog.getPeerConfiguration().setImageUrl(m_aButtons[i].getModel(), oResources[0], oResources[1]);
// Helper.setUnoPropertyValue(m_aButtons[i].getModel(), PropertyNames.PROPERTY_IMAGEURL, oResources[0]);
}
boolean bTabStop = Boolean.TRUE; // focusable ? Boolean.TRUE : Boolean.FALSE;
Helper.setUnoPropertyValue(m_aButtons[i].getModel(), "Tabstop", bTabStop);
// Object aEnabled = Helper.getUnoPropertyValue(m_aButtons[i].getModel(), PropertyNames.PROPERTY_ENABLED);
if (refreshOverNull)
{
setVisible(m_aButtons[i], true);
}
focusable = false;
}
}
// refreshSelection();
}
private void refreshCounterText()
{
Helper.setUnoPropertyValue(getModel(lblCounter), PropertyNames.PROPERTY_LABEL, counterRenderer.render(new Counter(pageStart + 1, pageEnd(), listModel.getSize())));
}
private int pageEnd()
{
int i = pageStart + cols * rows;
if (i > listModel.getSize() - 1)
{
return listModel.getSize();
}
else
{
return i;
}
}
/** Utility field holding list of ItemListeners. */
private transient java.util.ArrayList<XItemListener> m_aItemListenerList;
private void setVisible(Object control, boolean visible)
{
final XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, control);
xWindow.setVisible(visible);
}
/**
*
* @param i
* @return the Object in the list model corresponding to the given image index.
*/
private Object getObjectFor(int i)
{
int ii = getIndexFor(i);
if (listModel.getSize() <= ii)
{
return null;
}
else
{
return listModel.getElementAt(ii);
}
}
/**
*
* @param i
* @return the index in the listModel for the given image index.
*/
private int getIndexFor(int i)
{
return pageStart + i;
}
private int getImageIndexFor(int i)
{
return i - pageStart;
}
public void contentsChanged(ListDataEvent event)
{
/*//if the content that was changed is in the displayed range, refresh...
if ( (event.getIndex1() < getIndexFor(0)) // range is before...
|| event.getIndex0() > getIndexFor( cols*rows - 1)) ; //do nothing
else
refreshImages();
*/ //m_nCurrentSelection = 0;
//pageStart = 0;
//if (event.refreshImages();
}
public void intervalAdded(ListDataEvent event)
{
if (event.getIndex0() <= m_nCurrentSelection)
{
if (event.getIndex1() <= m_nCurrentSelection)
{
m_nCurrentSelection += event.getIndex1() - event.getIndex0() + 1;
}
}
if (event.getIndex0() < pageStart || event.getIndex1() < (pageStart + getRows() + getCols()))
{
refreshImages();
}
}
public void intervalRemoved(ListDataEvent event)
{
//contentsChanged(event);
}
/** Registers ItemListener to receive events.
* @param listener The listener to register.
*
*/
// @Override
public synchronized void addItemListener(XItemListener listener)
{
if (m_aItemListenerList == null)
{
m_aItemListenerList = new java.util.ArrayList<XItemListener>();
}
m_aItemListenerList.add(listener);
}
/** Removes ItemListener from the list of listeners.
* @param listener The listener to remove.
*
*/
public synchronized void removeItemListener(XItemListener listener)
{
if (m_aItemListenerList != null)
{
m_aItemListenerList.remove(listener);
}
}
/** Notifies all registered listeners about the event.
*
* @param event The event to be fired
*
*/
private void fireItemSelected()
{
// java.awt.event.ItemEvent event = new java.awt.event.ItemEvent(this, 0,
// getSelectedObject(), java.awt.event.ItemEvent.SELECTED);
java.util.ArrayList list;
synchronized(this)
{
if (m_aItemListenerList == null)
{
return;
}
list = (java.util.ArrayList) m_aItemListenerList.clone();
}
for (int i = 0; i < list.size(); i++)
{
((com.sun.star.awt.XItemListener) list.get(i)).itemStateChanged(null);
}
}
/**
* @return
*/
public int getCols()
{
return cols;
}
/**
* @return
*/
public Size getGap()
{
return gap;
}
/**
* @return
*/
public ListModel getListModel()
{
return listModel;
}
/**
* @return
*/
public Short getStep()
{
return step;
}
/**
* @return
*/
public int getPageStart()
{
return pageStart;
}
/**
* @return
*/
public Size getPos()
{
return pos;
}
/**
* @return
*/
public IImageRenderer getRenderer()
{
return renderer;
}
/**
* @return
*/
public int getRows()
{
return rows;
}
/**
* @return
*/
public int getSelected()
{
return m_nCurrentSelection;
}
/**
* @return
*/
public Size getSelectionGap()
{
return selectionGap;
}
/**
* @return
*/
public boolean isShowButtons()
{
return showButtons;
}
/**
* @param i
*/
public void setCols(int i)
{
cols = i;
}
/**
* @param size
*/
public void setGap(Size size)
{
gap = size;
}
/**
* @param model
*/
public void setListModel(ListModel model)
{
listModel = model;
}
/**
* @param short1
*/
public void setStep(Short short1)
{
step = short1;
}
/**
* @param i
*/
public void setPageStart(int i)
{
if (i == pageStart)
{
return;
}
pageStart = i;
enableButtons();
refreshImages();
}
/**
* @param _size
*/
public void setPos(Size _size)
{
pos = _size;
}
/**
* @param _renderer
*/
public void setRenderer(IImageRenderer _renderer)
{
this.renderer = _renderer;
}
/**
* @param i
*/
public void setRows(int i)
{
rows = i;
}
/**
* @param i
*/
public void setSelected(int i)
{
if (rowSelect && (i >= 0))
{
i = (i / cols) * cols;
}
if (m_nCurrentSelection == i)
{
return;
}
m_nCurrentSelection = i;
refreshImageText();
refreshSelection();
fireItemSelected();
}
/*
public void setSelected(Object object)
{
if (object == null)
{
setSelected(-1);
}
else
{
for (int i = 0; i < getListModel().getSize(); i++)
{
if (getListModel().getElementAt(i).equals(object))
{
setSelected(i);
return;
}
}
}
setSelected(-1);
}
*/
/**
* set the text under the button list
*/
private void refreshImageText()
{
Object item = m_nCurrentSelection >= 0 ? getListModel().getElementAt(m_nCurrentSelection) : null;
final String sText = PropertyNames.SPACE + renderer.render(item);
Helper.setUnoPropertyValue(getModel(lblImageText), PropertyNames.PROPERTY_LABEL, sText);
}
/**
* @param size
*/
public void setSelectionGap(Size size)
{
selectionGap = size;
}
/**
* @param b
*/
public void setShowButtons(boolean b)
{
showButtons = b;
}
public void nextPage()
{
if (pageStart < getListModel().getSize() - rows * cols)
{
setPageStart(pageStart + rows * cols);
}
}
public void prevPage()
{
if (pageStart == 0)
{
return;
}
int i = pageStart - rows * cols;
if (i < 0)
{
i = 0;
}
setPageStart(i);
}
private void enableButtons()
{
enable(btnNext, Boolean.valueOf(pageStart + rows * cols < listModel.getSize()));
enable(btnBack, Boolean.valueOf(pageStart > 0));
}
private void enable(Object control, Boolean enable)
{
Helper.setUnoPropertyValue(getModel(control), PropertyNames.PROPERTY_ENABLED, enable);
}
private Object getModel(Object control)
{
return UnoRuntime.queryInterface(XControl.class, control).getModel();
}
private void setBorder(Object control, Short border)
{
Helper.setUnoPropertyValue(getModel(control), PropertyNames.PROPERTY_BORDER, border);
//XWindowPeer peer = ((XControl)UnoRuntime.queryInterface(XControl.class,control)).getPeer();
//peer.invalidate(InvalidateStyle.CHILDREN);
}
public Object[] getSelectedObjects()
{
return new Object[]
{
getListModel().getElementAt(m_nCurrentSelection)
};
}
/**
*/
public static interface IImageRenderer extends IRenderer
{
/**
*
* @param listItem
* @return two resource ids for an image referenced in the imaglist resourcefile of the
* wizards project; The second one of them is designed to be used for High Contrast Mode.
*/
public Object[] getImageUrls(Object listItem);
}
private static class SimpleCounterRenderer implements IRenderer
{
// @Override
public String render(Object counter)
{
return PropertyNames.EMPTY_STRING + ((Counter) counter).start + ".." + ((Counter) counter).end + "/" + ((Counter) counter).max;
}
}
public static class Counter
{
public int start, end, max;
public Counter(int start_, int end_, int max_)
{
start = start_;
end = end_;
max = max_;
}
}
public Object getSelectedObject()
{
return m_nCurrentSelection >= 0 ? getListModel().getElementAt(m_nCurrentSelection) : null;
}
public void setRowSelect(boolean b)
{
rowSelect = b;
}
public boolean isRowSelect()
{
return rowSelect;
}
/**
* jump to the given item (display the screen
* that contains the given item).
* @param i
*/
public void display(int i)
{
int is = (getCols() * getRows());
int ps = (listModel.getSize() / is) * is;
setPageStart(ps);
}
/**
* @return
*/
public boolean isenabled()
{
return benabled;
}
/**
* @param b
*/
public void setenabled(boolean b)
{
for (int i = 0; i < m_aButtons.length; i++)
{
UnoDialog2.setEnabled(m_aButtons[i], b);
}
// UnoDialog2.setEnabled(grbxSelectedImage, b);
UnoDialog2.setEnabled(lblImageText, b);
if (showButtons)
{
UnoDialog2.setEnabled(btnBack, b);
UnoDialog2.setEnabled(btnNext, b);
UnoDialog2.setEnabled(lblCounter, b);
}
benabled = b;
}
/**
* refresh on all buttons, the selected button will get state pressed
*/
private void refreshSelection()
{
// reset all buttons to not set
for (int i = 0; i < m_aButtons.length; i++)
{
if (m_aButtons[i] != null)
{
XControlModel xModel = (XControlModel)UnoDialog2.getModel(m_aButtons[i]);
PropertySetHelper aHelper = new PropertySetHelper(xModel);
if (i == m_nCurrentSelection)
{
final short one = 1;
aHelper.setPropertyValueDontThrow(PropertyNames.PROPERTY_STATE, Short.valueOf(one));
}
else
{
final short zero = 0;
aHelper.setPropertyValueDontThrow(PropertyNames.PROPERTY_STATE, Short.valueOf(zero));
}
}
}
}
/**
* implementation of XActionListener
* will call if a button from the m_aButtonList is pressed.
* @param actionEvent
*/
// @Override
public void actionPerformed(com.sun.star.awt.ActionEvent actionEvent)
{
// bStopProcess = true;
XControlModel xModel = (XControlModel)UnoDialog2.getModel(actionEvent.Source);
PropertySetHelper aHelper = new PropertySetHelper(xModel);
int nState = aHelper.getPropertyValueAsInteger(PropertyNames.PROPERTY_STATE, -1);
if (nState == 0)
{
// this will avoid a wrong state, if already pressed.
aHelper.setPropertyValueDontThrow(PropertyNames.PROPERTY_STATE, Short.valueOf((short)1));
}
// check which Button is pressed.
String sControlName = aHelper.getPropertyValueAsString(PropertyNames.PROPERTY_NAME, PropertyNames.EMPTY_STRING);
final String sButton = sControlName.substring(7 + m_aControlName.length());
int nButton = Integer.parseInt(sButton);
// int image = getImageFromEvent(event);
int index = getIndexFor(nButton);
if (index < listModel.getSize())
{
// focus(image);
setSelected(index);
}
}
}