1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.log4j.chainsaw.zeroconf;
18
19 import javax.jmdns.ServiceEvent;
20 import javax.jmdns.ServiceInfo;
21 import javax.jmdns.ServiceListener;
22 import javax.swing.table.AbstractTableModel;
23 import java.util.ArrayList;
24 import java.util.Iterator;
25 import java.util.List;
26
27 public class ZeroConfDeviceModel extends AbstractTableModel implements ServiceListener {
28
29 private List<ServiceInfo> deviceList = new ArrayList<>();
30 private ZeroConfPreferenceModel zeroConfPreferenceModel;
31 private transient ZeroConfPlugin plugin;
32
33 public ZeroConfDeviceModel() {
34 }
35
36 public int getRowCount() {
37 return deviceList.size();
38 }
39
40 public int getColumnCount() {
41 return 4;
42 }
43
44 public ServiceInfo getServiceInfoAtRow(int row) {
45 return deviceList.get(row);
46 }
47
48 public Object getValueAt(int rowIndex, int columnIndex) {
49 ServiceInfo info = deviceList.get(rowIndex);
50 if (info == null) {
51 return "";
52 }
53 switch (columnIndex) {
54 case 0:
55 return getAutoConnectHandle(info);
56 case 1:
57 return info.getAddress().getHostName() + ":" + info.getPort();
58 case 2:
59 return zeroConfPreferenceModel.getAutoConnectDevices().contains(getAutoConnectHandle(info)) ? Boolean.TRUE : Boolean.FALSE;
60 case 3:
61 return plugin.isConnectedTo(info) ? "Connected" : "Not Connected";
62
63 default:
64 return "";
65 }
66 }
67
68 private String getAutoConnectHandle(ServiceInfo info) {
69 return info.getName();
70 }
71
72 public void serviceAdded(ServiceEvent event) {
73 }
74
75 public void serviceRemoved(ServiceEvent event) {
76 for (Iterator<ServiceInfo> iter = deviceList.iterator(); iter.hasNext(); ) {
77 ServiceInfo info = iter.next();
78 if (info.getName().equals(event.getName())) {
79 iter.remove();
80 }
81 }
82 fireTableDataChanged();
83 }
84
85 public void serviceResolved(ServiceEvent event) {
86 deviceList.add(event.getInfo());
87 fireTableDataChanged();
88 }
89
90 public void setZeroConfPreferenceModel(
91 ZeroConfPreferenceModel zeroConfPreferenceModel) {
92 this.zeroConfPreferenceModel = zeroConfPreferenceModel;
93 }
94
95 public String getColumnName(int column) {
96 switch (column) {
97 case 0:
98 return "ZeroConf name";
99 case 1:
100 return "Address:Port";
101 case 2:
102 return "Auto-connect";
103 case 3:
104 return "Connection Status";
105 default:
106 return "";
107 }
108 }
109
110 public boolean isCellEditable(int rowIndex, int columnIndex) {
111 return columnIndex == 2;
112 }
113
114 public Class getColumnClass(int columnIndex) {
115 switch (columnIndex) {
116 case 2:
117 return Boolean.class;
118 default:
119 return super.getColumnClass(columnIndex);
120 }
121 }
122
123 public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
124 if (columnIndex != 2 || !(aValue instanceof Boolean)) {
125 return;
126 }
127 boolean autoConnect = (Boolean) aValue;
128 Object device = this.deviceList.get(rowIndex);
129 String autoConnectHandle = getAutoConnectHandle((ServiceInfo) device);
130 if (autoConnect) {
131 zeroConfPreferenceModel.getAutoConnectDevices().add(autoConnectHandle);
132 } else {
133 zeroConfPreferenceModel.getAutoConnectDevices().remove(autoConnectHandle);
134 }
135 fireTableDataChanged();
136 }
137
138 void setZeroConfPluginParent(ZeroConfPlugin parent) {
139 this.plugin = parent;
140 }
141
142
143 }