| /* |
| * 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 org.apache.felix.upnp.tester.gui; |
| |
| |
| |
| import java.awt.Component; |
| import java.awt.Cursor; |
| import java.awt.Dimension; |
| import java.awt.GridBagLayout; |
| import java.awt.Point; |
| import java.awt.event.MouseAdapter; |
| import java.awt.event.MouseEvent; |
| import java.awt.event.MouseMotionListener; |
| |
| import javax.swing.JPanel; |
| import javax.swing.JScrollPane; |
| import javax.swing.JTable; |
| import javax.swing.JTree; |
| import javax.swing.event.TableModelEvent; |
| import javax.swing.table.AbstractTableModel; |
| import javax.swing.table.DefaultTableCellRenderer; |
| |
| import org.osgi.service.upnp.UPnPAction; |
| import org.osgi.service.upnp.UPnPDevice; |
| |
| import org.apache.felix.upnp.tester.Mediator; |
| import org.apache.felix.upnp.tester.discovery.DeviceNode; |
| |
| /* |
| * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a> |
| */ |
| public class PropertiesViewer extends JPanel { |
| |
| ActionPanel actionsPanel; |
| SubscriptionPanel subscriptionPanel; |
| DataModel dataModel; |
| JTable table; |
| |
| public PropertiesViewer(){ |
| super(new GridBagLayout()); |
| buildTable(); |
| actionsPanel = new ActionPanel(); |
| subscriptionPanel = new SubscriptionPanel(); |
| |
| JScrollPane scroll = new JScrollPane(table); |
| scroll.setPreferredSize(new Dimension(500,200)); |
| //actionsPanel.setPreferredSize(new Dimension(500,100)); twa |
| actionsPanel.setPreferredSize(new Dimension(500,200)); |
| add(scroll,Util.setConstrains(0,0,6,2,100,50)); |
| add(actionsPanel,Util.setConstrains(0,2,6,1,100,20)); |
| add(subscriptionPanel,Util.setConstrains(0,3,6,1,100,5)); |
| showActionPanel(false); |
| showSubscriptionPanel(false); |
| |
| table.addMouseMotionListener(new MouseMotionListener(){ |
| private final Cursor handCursor = new Cursor(Cursor.HAND_CURSOR); |
| |
| public void mouseDragged(MouseEvent e) {} |
| public void mouseMoved(MouseEvent e) { |
| String link = getDataLink(e.getPoint()); |
| if (link != null) |
| table.setCursor(handCursor); |
| else |
| table.setCursor(Cursor.getDefaultCursor()); |
| } |
| |
| }); |
| |
| table.addMouseListener(new MouseAdapter(){ |
| public void mouseClicked(MouseEvent e){ |
| String link = getDataLink(e.getPoint()); |
| if (link != null) |
| Util.openUrl(link); |
| } |
| }); |
| |
| } |
| |
| public String getDataLink(Point p) { |
| int col = table.columnAtPoint(p); |
| if (col != 1) |
| return null; |
| else { |
| int row = table.rowAtPoint(p); |
| String data = (String) dataModel.getValueAt(row,col); |
| if (data == null) return null; |
| if (data.length()<4) return null; |
| String begin = data.substring(0,4); |
| if (begin.equalsIgnoreCase("http")) |
| return data; |
| else { |
| String propertyName= (String) dataModel.getValueAt(row,0); |
| if (propertyName.equalsIgnoreCase(UPnPDevice.PRESENTATION_URL) |
| ||propertyName.equalsIgnoreCase(UPnPDevice.MANUFACTURER_URL) |
| ||propertyName.equalsIgnoreCase(UPnPDevice.MODEL_URL) ) |
| { |
| JTree tree = Mediator.getUPnPDeviceTree(); |
| UPnPDeviceTreeNode selectedNode = (UPnPDeviceTreeNode)tree.getLastSelectedPathComponent(); |
| String url = ""; |
| if (selectedNode.category.equals(UPnPDeviceTreeNode.DEVICE)){ |
| UPnPDeviceTreeNode parent = (UPnPDeviceTreeNode)selectedNode.getParent(); |
| while (parent.category!=UPnPDeviceTreeNode.ROOT_DEVICE) |
| parent = (UPnPDeviceTreeNode)parent.getParent(); |
| DeviceNode device = (DeviceNode) parent.getUserObject(); |
| String udn = (String)device.getReference().getProperty(UPnPDevice.UDN); |
| url = Mediator.getDriverProxy().resolveRelativeUrl(udn,data); |
| return url; |
| } |
| else if (selectedNode.category.equals(UPnPDeviceTreeNode.ROOT_DEVICE)) |
| { |
| DeviceNode node = (DeviceNode) selectedNode.getUserObject(); |
| String udn = (String)node.getReference().getProperty(UPnPDevice.UDN); |
| url = Mediator.getDriverProxy().resolveRelativeUrl(udn,data); |
| return url; |
| } |
| } |
| return null; |
| } |
| } |
| } |
| |
| public void setProperties(String[]name,String[]values){ |
| dataModel.setData(name,values); |
| } |
| |
| public void setAction(UPnPAction action){ |
| actionsPanel.setArguments(action); |
| |
| } |
| |
| public void showActionPanel(boolean show){ |
| actionsPanel.setVisible(show); |
| } |
| |
| public void showSubscriptionPanel(boolean show){ |
| subscriptionPanel.setVisible(show); |
| } |
| |
| private void buildTable(){ |
| dataModel = new DataModel(); |
| table = new JTable(dataModel); |
| table.setDefaultRenderer(table.getColumnClass(1), new LinkCellRenderer()); |
| } |
| |
| |
| } |
| |
| class DataModel extends AbstractTableModel { |
| int size = 0; |
| String[] names = new String[]{""}; |
| String[] values = new String[]{""}; |
| String[] header = new String[]{"property key","value"}; |
| |
| public String getColumnName(int col) { return header[col]; } |
| public int getColumnCount() { return 2; } |
| public int getRowCount() { return size;} |
| public Object getValueAt(int row, int col) { |
| if (col==0) return names[row]; |
| else return values[row]; |
| } |
| |
| /* |
| public boolean isCellEditable(int rowIndex, int columnIndex) { |
| return false; |
| } |
| */ |
| |
| public void setData(String[]names,String[]values){ |
| this.names=names; |
| this.values=values; |
| size = names.length; |
| this.fireTableChanged(new TableModelEvent(this)); |
| } |
| |
| } |
| |
| class LinkCellRenderer extends DefaultTableCellRenderer |
| { |
| public LinkCellRenderer(){ |
| super(); |
| } |
| |
| public Component getTableCellRendererComponent(JTable table, Object value, |
| boolean isSelected, boolean hasFocus, int row, int column) { |
| super.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column); |
| if (column==1){ |
| String propertyName = (String)table.getModel().getValueAt(row,0); |
| if (propertyName.equalsIgnoreCase(UPnPDevice.PRESENTATION_URL) |
| ||propertyName.equalsIgnoreCase(UPnPDevice.MODEL_URL) |
| ||propertyName.equalsIgnoreCase(UPnPDevice.MANUFACTURER_URL)) |
| { |
| if (!value.equals("")) |
| setValue("<html><a href=''>"+value+"</a></html>"); |
| return this; |
| } |
| if (((String) value).length()<4) return this; |
| String begin = ((String) value).substring(0,4); |
| if (begin.equalsIgnoreCase("http")) |
| setValue("<html><a href=''>"+value+"</a></html>"); |
| } |
| return this; |
| } |
| |
| } |
| |