1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 package com.sun.star.wizards.ui;
24 
25 // import com.sun.star.awt.*;
26 
27 import com.sun.star.awt.Key;
28 import com.sun.star.awt.KeyEvent;
29 import com.sun.star.awt.MouseEvent;
30 import com.sun.star.awt.Size;
31 import com.sun.star.awt.XButton;
32 import com.sun.star.awt.XControl;
33 import com.sun.star.awt.XFixedText;
34 import com.sun.star.awt.XItemEventBroadcaster;
35 import com.sun.star.awt.XItemListener;
36 import com.sun.star.awt.XKeyListener;
37 import com.sun.star.awt.XMouseListener;
38 import com.sun.star.awt.XWindow;
39 import com.sun.star.lang.EventObject;
40 import com.sun.star.uno.UnoRuntime;
41 import com.sun.star.wizards.common.Helper;
42 import com.sun.star.wizards.common.HelpIds;
43 import com.sun.star.wizards.common.IRenderer;
44 import com.sun.star.wizards.common.PropertyNames;
45 import com.sun.star.wizards.ui.event.*;
46 
47 
48 //import com.sun.star.awt.ItemEvent;
49 //import com.sun.star.awt.XItemListener;
50 
51 
52 import javax.swing.ListModel;
53 import javax.swing.event.ListDataEvent;
54 import javax.swing.event.ListDataListener;
55 
56 /**
57  *
58  * @author  rpiterman
59  */
60 public class ImageList implements XItemEventBroadcaster, ListDataListener
61 {
62 
63     // private XControl imgContainer;
64     private XFixedText lblImageText;
65     private XFixedText grbxSelectedImage;
66     private XButton btnBack;
67     private XButton btnNext;
68     private XFixedText lblCounter;
69     private XControl m_aImages[];
70     private boolean benabled = true;
71     private UnoDialog2 oUnoDialog;
72     private Size gap = new Size(4, 4);
73     private int cols = 4;
74     private int rows = 3;
75     private Size imageSize = new Size(20, 20);
76     private Size pos;
77     private Size selectionGap = new Size(2, 2);
78     private boolean showButtons = true;
79     private Short step;
80     private final static Short NO_BORDER = new Short((short) 0);
81     private boolean refreshOverNull = true;
82     private int imageTextLines = 1;
83     private boolean rowSelect = false;
84     public int tabIndex;
85     public Boolean scaleImages = Boolean.TRUE;
86     public String name = "il";
87     private int selected = -1;
88     private int pageStart = 0;
89     public int helpURL = 0;
90     private CommonListener uiEventListener = new CommonListener();
91     private IImageRenderer renderer;
92     private ListModel listModel;
93     public IRenderer counterRenderer = new SimpleCounterRenderer();
94     private Object dialogModel;
95     private ImageKeyListener imageKeyListener;
96     private static final Integer BACKGROUND_COLOR = 16777216;  //new Integer(SystemColor.window.getRGB() + 16777216);
97     private final static Short HIDE_PAGE = new Short((short) 99);
98     private final static Integer TRANSPARENT = new Integer(-1);
99     private final static int LINE_HEIGHT = 8;    //private MethodInvocation METHOD_MOUSE_ENTER_IMAGE;
100     //private MethodInvocation METHOD_MOUSE_EXIT_IMAGE;
101     private MethodInvocation METHOD_MOUSE_PRESSED;
102 
103     /** Getter for property imageSize.
104      * @return Value of property imageSize.
105      *
106      */
getImageSize()107     public Size getImageSize()
108     {
109         return this.imageSize;
110     }
111 
112     /** Setter for property imageSize.
113      * @param imageSize New value of property imageSize.
114      *
115      */
setImageSize(Size imageSize)116     public void setImageSize(Size imageSize)
117     {
118         this.imageSize = imageSize;
119     }
120 
121     class OMouseListener implements XMouseListener
122     {
OMouseListener()123         public OMouseListener()
124         {}
mousePressed(MouseEvent arg0)125         public void mousePressed(MouseEvent arg0)
126         {
127             focus(getImageIndexFor(getSelected()));
128         }
129 
mouseReleased(MouseEvent arg0)130         public void mouseReleased(MouseEvent arg0)
131         {
132         }
133 
mouseEntered(MouseEvent arg0)134         public void mouseEntered(MouseEvent arg0)
135         {
136         }
137 
mouseExited(MouseEvent arg0)138         public void mouseExited(MouseEvent arg0)
139         {
140         }
141 
disposing(EventObject arg0)142         public void disposing(EventObject arg0)
143         {
144         }
145     }
146 
create(UnoDialog2 dialog)147     public void create(UnoDialog2 dialog)
148     {
149         oUnoDialog = dialog;
150         dialogModel = dialog.xDialogModel;
151 
152         int imageTextHeight = imageTextLines * LINE_HEIGHT;
153 
154         PeerConfig opeerConfig = new PeerConfig(dialog);
155 
156         MOVE_SELECTION_VALS[2] = step;
157 
158         XControl imgContainer = dialog.insertImage(name + "lblContainer",
159                 new String[]
160                 {
161                     "BackgroundColor",
162                     PropertyNames.PROPERTY_BORDER,
163                     PropertyNames.PROPERTY_HEIGHT,
164                     PropertyNames.PROPERTY_POSITION_X,
165                     PropertyNames.PROPERTY_POSITION_Y,
166                     PropertyNames.PROPERTY_STEP,
167                     PropertyNames.PROPERTY_WIDTH
168                 },
169                 new Object[]
170                 {
171                     BACKGROUND_COLOR,
172                     new Short((short) 1),
173                     new Integer((imageSize.Height + gap.Height) * rows + gap.Height + imageTextHeight + 1),
174                     new Integer(pos.Width),
175                     new Integer(pos.Height),
176                     step,
177                     new Integer((imageSize.Width + gap.Width) * cols + gap.Width)
178                 });
179 
180         opeerConfig.setPeerProperties(imgContainer, new String[]
181                 {
182                     "MouseTransparent"
183                 }, new Object[]
184                 {
185                     Boolean.TRUE
186                 });
187 
188         //XWindow win = (XWindow)UnoRuntime.queryInterface(XWindow.class,lblContainer);
189         /*dialog.xWindow.addWindowListener(uiEventListener);
190         String dName = (String)Helper.getUnoPropertyValue(dialog.xDialogModel,PropertyNames.PROPERTY_NAME);
191 
192         uiEventListener.add(dName,EventNames.EVENT_WINDOW_SHOWN,"disableContainerMouseEvents",this);
193          */
194         int selectionWidth = rowSelect ?
195             (imageSize.Width + gap.Width) * cols - gap.Width + (selectionGap.Width * 2) :
196             imageSize.Width + (selectionGap.Width * 2);
197 
198         grbxSelectedImage = dialog.insertLabel(name + "_grbxSelected", new String[]
199                 {
200                     "BackgroundColor",
201                     PropertyNames.PROPERTY_BORDER,
202                     PropertyNames.PROPERTY_HEIGHT,
203                     PropertyNames.PROPERTY_POSITION_X,
204                     PropertyNames.PROPERTY_POSITION_Y,
205                     PropertyNames.PROPERTY_STEP,
206                     "Tabstop",
207                     PropertyNames.PROPERTY_WIDTH
208                 }, new Object[]
209                 {
210                     TRANSPARENT,
211                     new Short((short) 1),
212                     new Integer(imageSize.Height + (selectionGap.Height * 2)),
213                     //height
214                     0, //posx
215                     0, //posy
216                     step,
217                     Boolean.TRUE,
218                     new Integer(selectionWidth)
219                 });
220 
221         XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, grbxSelectedImage);
222         xWindow.addMouseListener(new OMouseListener());
223 
224         final String[] pNames1 = new String[]
225         {
226             PropertyNames.PROPERTY_HEIGHT,
227             PropertyNames.PROPERTY_HELPURL,
228             PropertyNames.PROPERTY_POSITION_X,
229             PropertyNames.PROPERTY_POSITION_Y,
230             PropertyNames.PROPERTY_STEP,
231             PropertyNames.PROPERTY_TABINDEX,
232             "Tabstop",
233             PropertyNames.PROPERTY_WIDTH
234         };
235 
236         lblImageText = dialog.insertLabel(name + "_imageText", pNames1, new Object[]
237                 {
238                     new Integer(imageTextHeight),
239                     PropertyNames.EMPTY_STRING,
240                     new Integer(pos.Width + 1),
241                     new Integer(pos.Height + (imageSize.Height + gap.Height) * rows + gap.Height),
242                     step,
243                     new Short((short) 0),
244                     Boolean.FALSE,
245                     new Integer(cols * (imageSize.Width + gap.Width) + gap.Width - 2)
246                 });
247 
248 
249         if (showButtons)
250         {
251             final Integer btnSize = 14;
252 
253             btnBack = dialog.insertButton(name + "_btnBack", "prevPage", this, pNames1, new Object[]
254                     {
255                         btnSize,
256                         HelpIds.getHelpIdString(helpURL++),
257                         new Integer(pos.Width),
258                         new Integer(pos.Height + (imageSize.Height + gap.Height) * rows + gap.Height + imageTextHeight + 1),
259                         step,
260                         new Short((short) (tabIndex + 1)),
261                         Boolean.TRUE,
262                         btnSize
263                     });
264 
265             btnNext = dialog.insertButton(name + "_btnNext", "nextPage", this, pNames1, new Object[]
266                     {
267                         btnSize,
268                         HelpIds.getHelpIdString(helpURL++),
269                         new Integer(pos.Width + (imageSize.Width + gap.Width) * cols + gap.Width - btnSize.intValue() + 1),
270                         new Integer(pos.Height + (imageSize.Height + gap.Height) * rows + gap.Height + imageTextHeight + 1),
271                         step,
272                         new Short((short) (tabIndex + 2)),
273                         Boolean.TRUE,
274                         btnSize
275                     });
276 
277             lblCounter = dialog.insertLabel(name + "_lblCounter", pNames1, new Object[]
278                     {
279                         new Integer(LINE_HEIGHT),
280                         PropertyNames.EMPTY_STRING,
281                         new Integer(pos.Width + btnSize.intValue() + 1),
282                         new Integer(pos.Height + (imageSize.Height + gap.Height) * rows + gap.Height + imageTextHeight + ((btnSize.intValue() - LINE_HEIGHT) / 2)),
283                         step,
284                         new Short((short) 0),
285                         Boolean.FALSE,
286                         new Integer(cols * (imageSize.Width + gap.Width) + gap.Width - 2 * btnSize.intValue() - 1)
287                     });
288 
289             Helper.setUnoPropertyValue(getModel(lblCounter), PropertyNames.PROPERTY_ALIGN, new Short((short) 1));
290             Helper.setUnoPropertyValue(getModel(btnBack), PropertyNames.PROPERTY_LABEL, "<");
291             Helper.setUnoPropertyValue(getModel(btnNext), PropertyNames.PROPERTY_LABEL, ">");
292 
293 
294         }
295 
296         imageKeyListener = new ImageKeyListener();
297         m_tabIndex = new Short((short) tabIndex);
298 
299         m_aImages = new XControl[rows * cols];
300 
301         try
302         {
303             //METHOD_MOUSE_ENTER_IMAGE = new MethodInvocation("mouseEnterImage",this,Object.class);
304             //METHOD_MOUSE_EXIT_IMAGE = new MethodInvocation("mouseExitImage",this,Object.class);
305             METHOD_MOUSE_PRESSED = new MethodInvocation("mousePressed", this, Object.class);
306         }
307         catch (NoSuchMethodException e)
308         {
309             e.printStackTrace();
310         }
311 
312         m_imageHeight = new Integer(imageSize.Height);
313         m_imageWidth = new Integer(imageSize.Width);
314 
315         for (int r = 0; r < rows; r++)
316         {
317             for (int c = 0; c < cols; c++)
318             {
319                 m_aImages[r * cols + c] = createImage(dialog, r, c);
320             }
321         }
322         refreshImages();
323 
324         listModel.addListDataListener(this);
325 
326     }
327     private Integer m_imageHeight,  m_imageWidth;
328     private final static String[] IMAGE_PROPS = new String[]
329     {
330         PropertyNames.PROPERTY_BORDER,
331         "BackgroundColor",
332         PropertyNames.PROPERTY_HEIGHT,
333         PropertyNames.PROPERTY_HELPURL,
334         PropertyNames.PROPERTY_POSITION_X,
335         PropertyNames.PROPERTY_POSITION_Y,
336         "ScaleImage",
337         PropertyNames.PROPERTY_STEP,
338         PropertyNames.PROPERTY_TABINDEX,
339         "Tabstop",
340         PropertyNames.PROPERTY_WIDTH
341     };
342     //used for optimization
343     private Short m_tabIndex;
344 
createImage(UnoDialog2 dialog, int _row, int _col)345     private XControl createImage(UnoDialog2 dialog, int _row, int _col)
346                 {
347         String imageName = name + "_image" + (_row * cols + _col);
348         XControl image = dialog.insertImage(imageName,
349                 IMAGE_PROPS,
350                 new Object[]
351                 {
352                     NO_BORDER,
353                     BACKGROUND_COLOR,
354                     m_imageHeight,
355                     HelpIds.getHelpIdString(helpURL++),
356                     new Integer(getImagePosX(_col)),
357                     new Integer(getImagePosY(_row)),
358                     scaleImages,
359                     step,
360                     m_tabIndex,
361                     Boolean.FALSE,
362                     m_imageWidth
363                 });
364 
365         XWindow win = UnoRuntime.queryInterface(XWindow.class, image);
366         win.addMouseListener(uiEventListener);
367         win.addKeyListener(imageKeyListener);
368         //uiEventListener.add(imageName,EventNames.EVENT_MOUSE_ENTERED,METHOD_MOUSE_ENTER_IMAGE);
369         //uiEventListener.add(imageName,EventNames.EVENT_MOUSE_EXITED,METHOD_MOUSE_EXIT_IMAGE);
370         uiEventListener.add(imageName, EventNames.EVENT_MOUSE_PRESSED, METHOD_MOUSE_PRESSED);
371 
372         return image;
373     }
374 
getImagePosX(int col)375     private int getImagePosX(int col)
376     {
377         return pos.Width + col * (imageSize.Width + gap.Width) + gap.Width;
378     }
379 
getImagePosY(int row)380     private int getImagePosY(int row)
381     {
382         return pos.Height + row * (imageSize.Height + gap.Height) + gap.Height;
383     }
384 
refreshImages()385     private void refreshImages()
386     {
387         if (showButtons)
388         {
389             refreshCounterText();
390         }
391         hideSelection();
392         if (refreshOverNull)
393         {
394             for (int i = 0; i < m_aImages.length; i++)
395             {
396                 setVisible(m_aImages[i], false);
397             }
398         }
399         boolean focusable = true;
400         for (int i = 0; i < m_aImages.length; i++)
401         {
402             Object[] oResources = renderer.getImageUrls(getObjectFor(i));
403             if (oResources != null)
404             {
405                 if (oResources.length == 1)
406                 {
407                     Helper.setUnoPropertyValue(m_aImages[i].getModel(), PropertyNames.PROPERTY_IMAGEURL, oResources[0]);
408                 }
409                 else if (oResources.length == 2)
410                 {
411                     oUnoDialog.getPeerConfiguration().setImageUrl(m_aImages[i].getModel(), oResources[0], oResources[1]);
412                 }
413                 Helper.setUnoPropertyValue(m_aImages[i].getModel(), "Tabstop", focusable ? Boolean.TRUE : Boolean.FALSE);
414                 if (refreshOverNull)
415                 {
416                     setVisible(m_aImages[i], true);
417                 }
418                 focusable = false;
419             }
420         }
421         refreshSelection();
422     }
423 
refreshCounterText()424     private void refreshCounterText()
425     {
426         Helper.setUnoPropertyValue(getModel(lblCounter), PropertyNames.PROPERTY_LABEL, counterRenderer.render(new Counter(pageStart + 1, pageEnd(), listModel.getSize())));
427     }
428 
pageEnd()429     private int pageEnd()
430     {
431         int i = pageStart + cols * rows;
432         if (i > listModel.getSize() - 1)
433         {
434             return listModel.getSize();
435         }
436         else
437         {
438             return i;
439         }
440     }
441 
refreshSelection()442     private void refreshSelection()
443     {
444         if (selected < pageStart || selected >= (pageStart + rows * cols))
445         {
446             hideSelection();
447         }
448         else
449         {
450             moveSelection(getImageIndexFor(selected));
451         }
452     }
453 
hideSelection()454     private void hideSelection()
455     {
456         Helper.setUnoPropertyValue(getModel(grbxSelectedImage), PropertyNames.PROPERTY_STEP, HIDE_PAGE);
457         setVisible(grbxSelectedImage, false);
458     }
459     private final static String[] MOVE_SELECTION = new String[]
460     {
461         PropertyNames.PROPERTY_POSITION_X, PropertyNames.PROPERTY_POSITION_Y, PropertyNames.PROPERTY_STEP
462     };
463     private Object[] MOVE_SELECTION_VALS = new Object[3];
464     /** Utility field holding list of ItemListeners. */
465     private transient java.util.ArrayList itemListenerList;
466 
moveSelection(int image)467     private void moveSelection(int image)
468     {
469         //System.out.println(image);
470         setVisible(grbxSelectedImage, false);
471 
472         int row = image / cols;
473         int col = rowSelect ? 0 : image - (row * cols);
474 
475         MOVE_SELECTION_VALS[0] = new Integer(getImagePosX(col) - selectionGap.Width);
476         MOVE_SELECTION_VALS[1] = new Integer(getImagePosY(row) - selectionGap.Height);
477 
478         Helper.setUnoPropertyValues(getModel(grbxSelectedImage), MOVE_SELECTION, MOVE_SELECTION_VALS);
479 
480         if (((Number) Helper.getUnoPropertyValue(dialogModel, PropertyNames.PROPERTY_STEP)).shortValue() == step.shortValue())
481         {
482             setVisible(grbxSelectedImage, true);        //now focus...
483         }
484         for (int i = 0; i < m_aImages.length; i++)
485         {
486             if (i != image)
487             {
488                 defocus(i);
489             }
490             else
491             {
492                 Helper.setUnoPropertyValue(m_aImages[image].getModel(), "Tabstop", Boolean.TRUE);
493             }
494         }
495     }
496 
setVisible(Object control, boolean visible)497     private void setVisible(Object control, boolean visible)
498     {
499         UnoRuntime.queryInterface(XWindow.class, control).setVisible(visible);
500     }
501 
502     /**
503      *
504      * @param i
505      * @return the Object in the list model corresponding to the given image index.
506      */
getObjectFor(int i)507     private Object getObjectFor(int i)
508     {
509         int ii = getIndexFor(i);
510         if (listModel.getSize() <= ii)
511         {
512             return null;
513         }
514         else
515         {
516             return listModel.getElementAt(ii);
517         }
518     }
519 
520     /**
521      *
522      * @param i
523      * @return the index in the listModel for the given image index.
524      */
getIndexFor(int i)525     private int getIndexFor(int i)
526     {
527         return pageStart + i;
528     }
529 
getImageIndexFor(int i)530     private int getImageIndexFor(int i)
531     {
532         return i - pageStart;
533     }
534 
contentsChanged(ListDataEvent event)535     public void contentsChanged(ListDataEvent event)
536     {
537         /*//if the content that was changed is in the displayed range, refresh...
538         if (  (event.getIndex1() <  getIndexFor(0)) // range is before...
539         || event.getIndex0() > getIndexFor( cols*rows - 1)) ; //do nothing
540         else
541         refreshImages();
542          */        //selected = 0;
543         //pageStart = 0;
544         //if (event.refreshImages();
545     }
546 
intervalAdded(ListDataEvent event)547     public void intervalAdded(ListDataEvent event)
548     {
549         if (event.getIndex0() <= selected)
550         {
551             if (event.getIndex1() <= selected)
552             {
553                 selected += event.getIndex1() - event.getIndex0() + 1;
554             }
555         }
556         if (event.getIndex0() < pageStart || event.getIndex1() < (pageStart + getRows() + getCols()))
557         {
558             refreshImages();
559         }
560     }
561 
intervalRemoved(ListDataEvent event)562     public void intervalRemoved(ListDataEvent event)
563     {
564         //contentsChanged(event);
565     }
566 
567     /** Registers ItemListener to receive events.
568      * @param listener The listener to register.
569      *
570      */
addItemListener(XItemListener listener)571     public synchronized void addItemListener(XItemListener listener)
572     {
573         if (itemListenerList == null)
574         {
575             itemListenerList = new java.util.ArrayList();
576         }
577         itemListenerList.add(listener);
578     }
579 
580     /** Removes ItemListener from the list of listeners.
581      * @param listener The listener to remove.
582      *
583      */
removeItemListener(XItemListener listener)584     public synchronized void removeItemListener(XItemListener listener)
585     {
586         if (itemListenerList != null)
587         {
588             itemListenerList.remove(listener);
589         }
590     }
591 
592     /** Notifies all registered listeners about the event.
593      *
594      * @param event The event to be fired
595      *
596      */
fireItemSelected()597     private void fireItemSelected()
598     {
599 //      java.awt.event.ItemEvent event = new java.awt.event.ItemEvent(this, 0,
600 //          getSelectedObject(), java.awt.event.ItemEvent.SELECTED);
601         java.util.ArrayList list;
602         synchronized(this)
603         {
604             if (itemListenerList == null)
605             {
606                 return;
607             }
608             list = (java.util.ArrayList) itemListenerList.clone();
609         }
610         for (int i = 0; i < list.size(); i++)
611         {
612             ((com.sun.star.awt.XItemListener) list.get(i)).itemStateChanged(null);
613         }
614     }
615 
616     /**
617      * @return
618      */
getCols()619     public int getCols()
620     {
621         return cols;
622     }
623 
624     /**
625      * @return
626      */
getGap()627     public Size getGap()
628     {
629         return gap;
630     }
631 
632     /**
633      * @return
634      */
getListModel()635     public ListModel getListModel()
636     {
637         return listModel;
638     }
639 
640     /**
641      * @return
642      */
getStep()643     public Short getStep()
644     {
645         return step;
646     }
647 
648     /**
649      * @return
650      */
getPageStart()651     public int getPageStart()
652     {
653         return pageStart;
654     }
655 
656     /**
657      * @return
658      */
getPos()659     public Size getPos()
660     {
661         return pos;
662     }
663 
664     /**
665      * @return
666      */
getRenderer()667     public IImageRenderer getRenderer()
668     {
669         return renderer;
670     }
671 
672     /**
673      * @return
674      */
getRows()675     public int getRows()
676     {
677         return rows;
678     }
679 
680     /**
681      * @return
682      */
getSelected()683     public int getSelected()
684     {
685         return selected;
686     }
687 
688     /**
689      * @return
690      */
getSelectionGap()691     public Size getSelectionGap()
692     {
693         return selectionGap;
694     }
695 
696     /**
697      * @return
698      */
isShowButtons()699     public boolean isShowButtons()
700     {
701         return showButtons;
702     }
703 
704     /**
705      * @param i
706      */
setCols(int i)707     public void setCols(int i)
708     {
709         cols = i;
710     }
711 
712     /**
713      * @param size
714      */
setGap(Size size)715     public void setGap(Size size)
716     {
717         gap = size;
718     }
719 
720     /**
721      * @param model
722      */
setListModel(ListModel model)723     public void setListModel(ListModel model)
724     {
725         listModel = model;
726     }
727 
728     /**
729      * @param short1
730      */
setStep(Short short1)731     public void setStep(Short short1)
732     {
733         step = short1;
734     }
735 
736     /**
737      * @param i
738      */
setPageStart(int i)739     public void setPageStart(int i)
740     {
741         if (i == pageStart)
742         {
743             return;
744         }
745         pageStart = i;
746         enableButtons();
747         refreshImages();
748     }
749 
750     /**
751      * @param size
752      */
setPos(Size size)753     public void setPos(Size size)
754     {
755         pos = size;
756     }
757 
758     /**
759      * @param renderer
760      */
setRenderer(IImageRenderer renderer)761     public void setRenderer(IImageRenderer renderer)
762     {
763         this.renderer = renderer;
764     }
765 
766     /**
767      * @param i
768      */
setRows(int i)769     public void setRows(int i)
770     {
771         rows = i;
772     }
773 
774     /**
775      * @param i
776      */
setSelected(int i)777     public void setSelected(int i)
778     {
779         if (rowSelect && (i >= 0))
780         {
781             i = (i / cols) * cols;
782         }
783         if (selected == i)
784         {
785             return;
786         }
787         selected = i;
788         refreshImageText();
789         refreshSelection();
790         fireItemSelected();
791     }
792 
setSelected(Object object)793     public void setSelected(Object object)
794     {
795         if (object == null)
796         {
797             setSelected(-1);
798         }
799         else
800         {
801             for (int i = 0; i < getListModel().getSize(); i++)
802             {
803                 if (getListModel().getElementAt(i).equals(object))
804                 {
805                     setSelected(i);
806                     return;
807                 }
808             }
809         }
810         setSelected(-1);
811 
812     }
813 
refreshImageText()814     private void refreshImageText()
815     {
816         Object item = selected >= 0 ? getListModel().getElementAt(selected) : null;
817         Helper.setUnoPropertyValue(getModel(lblImageText), PropertyNames.PROPERTY_LABEL, PropertyNames.SPACE + renderer.render(item));
818     }
819 
820     /**
821      * @param size
822      */
setSelectionGap(Size size)823     public void setSelectionGap(Size size)
824     {
825         selectionGap = size;
826     }
827 
828     /**
829      * @param b
830      */
setShowButtons(boolean b)831     public void setShowButtons(boolean b)
832     {
833         showButtons = b;
834     }
835 
nextPage()836     public void nextPage()
837     {
838         if (pageStart < getListModel().getSize() - rows * cols)
839         {
840             setPageStart(pageStart + rows * cols);
841         }
842     }
843 
prevPage()844     public void prevPage()
845     {
846         if (pageStart == 0)
847         {
848             return;
849         }
850         int i = pageStart - rows * cols;
851         if (i < 0)
852         {
853             i = 0;
854         }
855         setPageStart(i);
856     }
857 
enableButtons()858     private void enableButtons()
859     {
860         enable(btnNext, Boolean.valueOf(pageStart + rows * cols < listModel.getSize()));
861         enable(btnBack, Boolean.valueOf(pageStart > 0));
862     }
863 
enable(Object control, Boolean enable)864     private void enable(Object control, Boolean enable)
865     {
866         Helper.setUnoPropertyValue(getModel(control), PropertyNames.PROPERTY_ENABLED, enable);
867     }
868 
getModel(Object control)869     private Object getModel(Object control)
870     {
871         return UnoRuntime.queryInterface(XControl.class, control).getModel();
872     }
873 
874     /*
875     public void mouseEnterImage(Object event) {
876     System.out.println("mouse enter");
877     int i = getImageFromEvent(event);
878     //TODO what is when the image does not display an image?
879     if (getIndexFor(i) != selected)
880     setBorder(m_aImages[i],imageBorderMO);
881     }
882 
883     public void mouseExitImage(Object event) {
884     //System.out.println("mouse exit");
885     int i = getImageFromEvent(event);
886     //TODO what is when the image does not display an image?
887     if (getIndexFor(i) != selected)
888     setBorder(m_aImages[i],imageBorder);
889     }
890      */
setBorder(Object control, Short border)891     private void setBorder(Object control, Short border)
892     {
893         Helper.setUnoPropertyValue(getModel(control), PropertyNames.PROPERTY_BORDER, border);
894     //XWindowPeer peer = ((XControl)UnoRuntime.queryInterface(XControl.class,control)).getPeer();
895     //peer.invalidate(InvalidateStyle.CHILDREN);
896     }
897 
getImageFromEvent(Object event)898     private int getImageFromEvent(Object event)
899     {
900         Object image = ((EventObject) event).Source;
901         String controlName = (String) Helper.getUnoPropertyValue(getModel(image), PropertyNames.PROPERTY_NAME);
902         return Integer.valueOf(controlName.substring(6 + name.length())).intValue();
903 
904     }
905 
mousePressed(Object event)906     public void mousePressed(Object event)
907     {
908         int image = getImageFromEvent(event);
909         int index = getIndexFor(image);
910         if (index < listModel.getSize())
911         {
912             focus(image);
913             setSelected(index);
914         }
915     }
916 
getSelectedObjects()917     public Object[] getSelectedObjects()
918     {
919         return new Object[]
920                 {
921                     getListModel().getElementAt(selected)
922                 };
923     }
924 
925     /**
926      */
927     public static interface IImageRenderer extends IRenderer
928     {
929 
930         /**
931          *
932          * @param listItem
933          * @return two resource ids for an image referenced in the imaglist resourcefile of the
934          * wizards project; The second one of them is designed to be used for High Contrast Mode.
935          */
getImageUrls(Object listItem)936         public Object[] getImageUrls(Object listItem);
937     }
938 
939     private static class SimpleCounterRenderer implements IRenderer
940     {
941 
render(Object counter)942         public String render(Object counter)
943         {
944             return PropertyNames.EMPTY_STRING + ((Counter) counter).start + ".." + ((Counter) counter).end + "/" + ((Counter) counter).max;
945         }
946     }
947 
948     public static class Counter
949     {
950 
951         public int start,  end,  max;
952 
Counter(int start_, int end_, int max_)953         public Counter(int start_, int end_, int max_)
954         {
955             start = start_;
956             end = end_;
957             max = max_;
958         }
959     }
960 
getSelectedObject()961     public Object getSelectedObject()
962     {
963         return selected >= 0 ? getListModel().getElementAt(selected) : null;
964     }
965 
showSelected()966     public void showSelected()
967     {
968         int oldPageStart = pageStart;
969         if (selected == -1)
970         {
971             pageStart += 0;
972         }
973         else
974         {
975             pageStart = (selected / m_aImages.length) * m_aImages.length;
976         }
977         if (oldPageStart != pageStart)
978         {
979             enableButtons();
980             refreshImages();
981         }
982     }
983 
setRowSelect(boolean b)984     public void setRowSelect(boolean b)
985     {
986         rowSelect = b;
987     }
988 
isRowSelect()989     public boolean isRowSelect()
990     {
991         return rowSelect;
992     }
993 
994     private class ImageKeyListener implements XKeyListener
995     {
996 
997         /* (non-Javadoc)
998          * @see com.sun.star.awt.XKeyListener#keyPressed(com.sun.star.awt.KeyEvent)
999          */
keyPressed(KeyEvent ke)1000         public void keyPressed(KeyEvent ke)
1001         {
1002             int image = getImageFromEvent(ke);
1003             int r = image / getCols();
1004             int c = image - (r * getCols());
1005             int d = getKeyMove(ke, r, c);
1006             int newImage = image + d;
1007             if (newImage == image)
1008             {
1009                 return;
1010             }
1011             if (isFocusable(newImage))
1012             {
1013                 changeFocus(image, newImage);
1014             }
1015         }
1016 
isFocusable(int image)1017         private boolean isFocusable(int image)
1018         {
1019             return (image >= 0) && (getIndexFor(image) < listModel.getSize());
1020         }
1021 
changeFocus(int oldFocusImage, int newFocusImage)1022         private void changeFocus(int oldFocusImage, int newFocusImage)
1023         {
1024             focus(newFocusImage);
1025             defocus(oldFocusImage);
1026         }
1027 
getKeyMove(KeyEvent ke, int row, int col)1028         private final int getKeyMove(KeyEvent ke, int row, int col)
1029         {
1030             switch (ke.KeyCode)
1031             {
1032                 case Key.UP:
1033                     if (row > 0)
1034                     {
1035                         return 0 - getCols();
1036                     }
1037                     break;
1038                 case Key.DOWN:
1039                     if (row < getRows() - 1)
1040                     {
1041                         return getCols();
1042                     }
1043                     break;
1044                 case Key.LEFT:
1045                     if (col > 0)
1046                     {
1047                         return -1;
1048                     }
1049                     break;
1050                 case Key.RIGHT:
1051                     if (col < getCols() - 1)
1052                     {
1053                         return 1;
1054                     }
1055                     break;
1056                 case Key.SPACE:
1057                     select(ke);
1058             }
1059             return 0;
1060         }
1061 
select(KeyEvent ke)1062         private void select(KeyEvent ke)
1063         {
1064             setSelected(getIndexFor(getImageFromEvent(ke)));
1065         }
1066 
keyReleased(KeyEvent ke)1067         public void keyReleased(KeyEvent ke)
1068         {
1069         }
1070 
disposing(EventObject arg0)1071         public void disposing(EventObject arg0)
1072         {
1073         }
1074     }
1075 
focus(int image)1076     private final void focus(int image)
1077     {
1078         Helper.setUnoPropertyValue(m_aImages[image].getModel(), "Tabstop",
1079                 Boolean.TRUE);
1080         XWindow xWindow = UnoRuntime.queryInterface(XWindow.class, m_aImages[image]);
1081         xWindow.setFocus();
1082     }
1083 
defocus(int image)1084     private final void defocus(int image)
1085     {
1086         Helper.setUnoPropertyValue(UnoDialog.getModel(m_aImages[image]), "Tabstop",
1087                 Boolean.FALSE);
1088 
1089     }
1090 
1091     /**
1092      * jump to the given item (display the screen
1093      * that contains the given item).
1094      * @param i
1095      */
display(int i)1096     public void display(int i)
1097     {
1098         int is = (getCols() * getRows());
1099         int ps = (listModel.getSize() / is) * is;
1100         setPageStart(ps);
1101     }
1102 
1103     /**
1104      * @return
1105      */
isenabled()1106     public boolean isenabled()
1107     {
1108         return benabled;
1109     }
1110 
1111     /**
1112      * @param b
1113      */
setenabled(boolean b)1114     public void setenabled(boolean b)
1115     {
1116 
1117         for (int i = 0; i < m_aImages.length; i++)
1118         {
1119             UnoDialog2.setEnabled(m_aImages[i], b);
1120         }
1121         UnoDialog2.setEnabled(grbxSelectedImage, b);
1122         UnoDialog2.setEnabled(lblImageText, b);
1123         if (showButtons)
1124         {
1125             UnoDialog2.setEnabled(btnBack, b);
1126             UnoDialog2.setEnabled(btnNext, b);
1127             UnoDialog2.setEnabled(lblCounter, b);
1128         }
1129         benabled = b;
1130     }
1131 }
1132