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.event; 24 25 import javax.swing.ListModel; 26 import javax.swing.event.ListDataEvent; 27 import javax.swing.event.ListDataListener; 28 29 import com.sun.star.awt.XComboBox; 30 import com.sun.star.awt.XListBox; 31 import com.sun.star.uno.UnoRuntime; 32 import com.sun.star.wizards.common.Helper; 33 import com.sun.star.wizards.common.PropertyNames; 34 35 /** 36 * @author rpiterman 37 38 * */ 39 public class ListModelBinder implements ListDataListener 40 { 41 42 private XListBox unoList; 43 private Object unoListModel; 44 private ListModel listModel; 45 private Renderer renderer = new Renderer() 46 { 47 48 public String render(Object item) 49 { 50 if (item == null) 51 { 52 return PropertyNames.EMPTY_STRING; 53 } 54 else 55 { 56 return item.toString(); 57 } 58 } 59 }; 60 ListModelBinder(Object unoListBox, ListModel listModel_)61 public ListModelBinder(Object unoListBox, ListModel listModel_) 62 { 63 unoList = UnoRuntime.queryInterface(XListBox.class, unoListBox); 64 unoListModel = UnoDataAware.getModel(unoListBox); 65 setListModel(listModel_); 66 } 67 setListModel(ListModel newListModel)68 public void setListModel(ListModel newListModel) 69 { 70 if (listModel != null) 71 { 72 listModel.removeListDataListener(this); 73 } 74 listModel = newListModel; 75 listModel.addListDataListener(this); 76 } 77 78 /* (non-Javadoc) 79 * @see javax.swing.event.ListDataListener#contentsChanged(javax.swing.event.ListDataEvent) 80 */ contentsChanged(ListDataEvent lde)81 public void contentsChanged(ListDataEvent lde) 82 { 83 short[] selected = getSelectedItems(); 84 for (short i = (short) lde.getIndex0(); i <= lde.getIndex1(); i++) 85 { 86 update(i); 87 } 88 setSelectedItems(selected); 89 } 90 update(short i)91 protected void update(short i) 92 { 93 remove(i, i); 94 insert(i); 95 } 96 remove(short i1, short i2)97 protected void remove(short i1, short i2) 98 { 99 unoList.removeItems(i1, (short) (i2 - i1 + 1)); 100 } 101 insert(short i)102 protected void insert(short i) 103 { 104 unoList.addItem(getItemString(i), i); 105 } 106 getItemString(short i)107 protected String getItemString(short i) 108 { 109 return getItemString(listModel.getElementAt((int) i)); 110 } 111 getItemString(Object item)112 protected String getItemString(Object item) 113 { 114 return renderer.render(item); 115 } 116 getSelectedItems()117 protected short[] getSelectedItems() 118 { 119 return (short[]) Helper.getUnoPropertyValue(unoListModel, PropertyNames.SELECTED_ITEMS); 120 } 121 setSelectedItems(short[] selected)122 protected void setSelectedItems(short[] selected) 123 { 124 Helper.setUnoPropertyValue(unoListModel, PropertyNames.SELECTED_ITEMS, selected); 125 } 126 127 /* (non-Javadoc) 128 * @see javax.swing.event.ListDataListener#intervalAdded(javax.swing.event.ListDataEvent) 129 */ intervalAdded(ListDataEvent lde)130 public void intervalAdded(ListDataEvent lde) 131 { 132 //Short[] selected = getSelectedItems(); 133 for (short i = (short) lde.getIndex0(); i <= lde.getIndex1(); i++) 134 { 135 insert(i); 136 137 /*int insertedItems = lde.getIndex1() - lde.getIndex0() + 1; 138 139 for (int i = 0; i<selected.length; i++) 140 if (selected[i].intValue() >= lde.getIndex0()) 141 selected[i] = new Short((short)(selected[i].shortValue() + insertedItems)); 142 setSelectedItems(selected);*/ 143 } 144 } 145 146 /* (non-Javadoc) 147 * @see javax.swing.event.ListDataListener#intervalRemoved(javax.swing.event.ListDataEvent) 148 */ intervalRemoved(ListDataEvent lde)149 public void intervalRemoved(ListDataEvent lde) 150 { 151 //Short[] selected = getSelectedItems(); 152 153 remove((short) lde.getIndex0(), (short) lde.getIndex1()); 154 155 /*int removed = 0; 156 for (int i = 0; i<selected.length; i++) { 157 short s = selected[i].shortValue(); 158 if (s>=lde.getIndex0() && s<==lde.getIndex1()) { 159 selected[i] = null; 160 removed++; 161 } 162 } 163 164 Short[] newSelected = (removed > 0 ? new Short[selected.length - removed] : selected; 165 if (removed>0) 166 167 if (selected[i].intValue() >= lde.getIndex0()) 168 */ 169 } 170 171 public static interface Renderer 172 { 173 render(Object item)174 public String render(Object item); 175 } 176 fillList(Object list, Object[] items, Renderer renderer)177 public static void fillList(Object list, Object[] items, Renderer renderer) 178 { 179 XListBox xlist = UnoRuntime.queryInterface(XListBox.class, list); 180 Helper.setUnoPropertyValue(UnoDataAware.getModel(list), PropertyNames.STRING_ITEM_LIST, new String[] 181 { 182 }); 183 for (short i = 0; i < items.length; i++) 184 { 185 if (items[i] != null) 186 { 187 xlist.addItem((renderer != null ? renderer.render(items[i]) : items[i].toString()), i); 188 } 189 } 190 } 191 fillComboBox(Object list, Object[] items, Renderer renderer)192 public static void fillComboBox(Object list, Object[] items, Renderer renderer) 193 { 194 XComboBox xComboBox = UnoRuntime.queryInterface(XComboBox.class, list); 195 Helper.setUnoPropertyValue(UnoDataAware.getModel(list), PropertyNames.STRING_ITEM_LIST, new String[] 196 { 197 }); 198 for (short i = 0; i < items.length; i++) 199 { 200 if (items[i] != null) 201 { 202 xComboBox.addItem((renderer != null ? renderer.render(items[i]) : items[i].toString()), i); 203 } 204 } 205 } 206 } 207