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