Autopsy  4.5.0
Graphical digital forensics platform for The Sleuth Kit and other tools.
DropdownToolbar.java
Go to the documentation of this file.
1 /*
2  * Autopsy Forensic Browser
3  *
4  * Copyright 2011-2017 Basis Technology Corp.
5  * Contact: carrier <at> sleuthkit <dot> org
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * 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, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 package org.sleuthkit.autopsy.keywordsearch;
20 
21 import java.awt.event.ActionEvent;
22 import java.awt.event.ActionListener;
23 import java.awt.event.MouseEvent;
24 import java.beans.PropertyChangeEvent;
25 import java.beans.PropertyChangeListener;
26 import java.util.EnumSet;
27 import java.util.logging.Level;
28 import javax.swing.SwingUtilities;
29 import javax.swing.event.PopupMenuEvent;
30 import javax.swing.event.PopupMenuListener;
34 
40 class DropdownToolbar extends javax.swing.JPanel {
41 
42  private static final long serialVersionUID = 1L;
43  private static final Logger logger = Logger.getLogger(DropdownToolbar.class.getName());
44  private static DropdownToolbar instance;
45  private SearchSettingsChangeListener searchSettingsChangeListener;
46  private boolean active = false;
47  private DropdownSingleTermSearchPanel dropPanel = null;
48 
56  public synchronized static DropdownToolbar getDefault() {
57  if (instance == null) {
58  instance = new DropdownToolbar();
59  }
60  return instance;
61  }
62 
68  private DropdownToolbar() {
69  initComponents();
70  customizeComponents();
71  }
72 
77  private void customizeComponents() {
78  searchSettingsChangeListener = new SearchSettingsChangeListener();
79  KeywordSearch.getServer().addServerActionListener(searchSettingsChangeListener);
80  Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), searchSettingsChangeListener);
81 
82  DropdownListSearchPanel listsPanel = DropdownListSearchPanel.getDefault();
83  listsPanel.addSearchButtonActionListener((ActionEvent e) -> {
84  listsMenu.setVisible(false);
85  });
86 
87  // Adding border of six to account for menu border
88  listsMenu.setSize(listsPanel.getPreferredSize().width + 6, listsPanel.getPreferredSize().height + 6);
89  listsMenu.add(listsPanel);
90  listsMenu.addPopupMenuListener(new PopupMenuListener() {
91  @Override
92  public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
93  listsButton.setSelected(true);
94  }
95 
96  @Override
97  public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
98  listsButton.setSelected(false);
99  }
100 
101  @Override
102  public void popupMenuCanceled(PopupMenuEvent e) {
103  listsButton.setSelected(false);
104  }
105  });
106 
107  dropPanel = DropdownSingleTermSearchPanel.getDefault();
108  dropPanel.addSearchButtonActionListener(new ActionListener() {
109  @Override
110  public void actionPerformed(ActionEvent e) {
111  searchMenu.setVisible(false);
112  }
113  });
114  searchMenu.setSize(dropPanel.getPreferredSize().width + 6, dropPanel.getPreferredSize().height + 6);
115  searchMenu.add(dropPanel);
116  searchMenu.addPopupMenuListener(new PopupMenuListener() {
117  @Override
118  public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
119  searchDropButton.setSelected(true);
120  }
121 
122  @Override
123  public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
124  searchDropButton.setSelected(false);
125  }
126 
127  @Override
128  public void popupMenuCanceled(PopupMenuEvent e) {
129  searchDropButton.setSelected(false);
130  }
131  });
132 
133  }
134 
135  private void maybeShowListsPopup(MouseEvent evt) {
136  if (!active || !listsButton.isEnabled()) {
137  return;
138  }
139  if (evt != null && !SwingUtilities.isLeftMouseButton(evt)) {
140  return;
141  }
142  listsMenu.show(listsButton, listsButton.getWidth() - listsMenu.getWidth(), listsButton.getHeight() - 1);
143  }
144 
145  private void maybeShowSearchPopup(MouseEvent evt) {
146  if (!active || !searchDropButton.isEnabled()) {
147  return;
148  }
149  if (evt != null && !SwingUtilities.isLeftMouseButton(evt)) {
150  return;
151  }
152  searchMenu.show(searchDropButton, searchDropButton.getWidth() - searchMenu.getWidth(), searchDropButton.getHeight() - 1);
153  }
154 
155  private class SearchSettingsChangeListener implements PropertyChangeListener {
156 
157  @Override
158  public void propertyChange(PropertyChangeEvent evt) {
160  String changed = evt.getPropertyName();
161  if (changed.equals(Case.Events.CURRENT_CASE.toString())) {
162  if (null != evt.getNewValue()) {
163  boolean disableSearch = false;
164  /*
165  * A case has been opened.
166  */
167  try {
168  Server server = KeywordSearch.getServer();
169  if (server.coreIsOpen() == false) {
170  disableSearch = true;
171  }
172  else {
173  Index indexInfo = server.getIndexInfo();
174  if (IndexFinder.getCurrentSolrVersion().equals(indexInfo.getSolrVersion())) {
175  /*
176  * Solr version is current, so check the Solr
177  * schema version and selectively enable the ad
178  * hoc search UI components.
179  */
180  boolean schemaIsCurrent = IndexFinder.getCurrentSchemaVersion().equals(indexInfo.getSchemaVersion());
181  listsButton.setEnabled(schemaIsCurrent);
182  searchDropButton.setEnabled(true);
183  dropPanel.setRegexSearchEnabled(schemaIsCurrent);
184  active = true;
185  } else {
186  /*
187  * Unsupported Solr version, disable the ad hoc
188  * search UI components.
189  */
190  disableSearch = true;
191  }
192  }
193  } catch (NoOpenCoreException ex) {
194  /*
195  * Error, disable the ad hoc search UI components.
196  */
197  logger.log(Level.SEVERE, "Error getting text index info", ex); //NON-NLS
198  disableSearch = true;
199  }
200 
201  if (disableSearch) {
202  searchDropButton.setEnabled(false);
203  listsButton.setEnabled(false);
204  active = false;
205  }
206 
207  } else {
208  /*
209  * A case has been closed.
210  */
211  dropPanel.clearSearchBox();
212  searchDropButton.setEnabled(false);
213  listsButton.setEnabled(false);
214  active = false;
215  }
216  } else if (changed.equals(Server.CORE_EVT)) {
217  final Server.CORE_EVT_STATES state = (Server.CORE_EVT_STATES) evt.getNewValue();
218  switch (state) {
219  case STARTED:
220  try {
221  final int numIndexedFiles = KeywordSearch.getServer().queryNumIndexedFiles();
222  KeywordSearch.fireNumIndexedFilesChange(null, numIndexedFiles);
224  logger.log(Level.SEVERE, "Error executing Solr query", ex); //NON-NLS
225  }
226  break;
227  case STOPPED:
228  break;
229  default:
230  }
231  }
232  }
233  }
234  }
235 
241  @SuppressWarnings("unchecked")
242  // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
243  private void initComponents() {
244 
245  listsMenu = new javax.swing.JPopupMenu();
246  searchMenu = new javax.swing.JPopupMenu();
247  listsButton = new javax.swing.JButton();
248  searchDropButton = new javax.swing.JButton();
249  jSeparator1 = new javax.swing.JSeparator();
250 
251  setOpaque(false);
252 
253  listsButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon.png"))); // NOI18N NON-NLS
254  listsButton.setText(org.openide.util.NbBundle.getMessage(DropdownToolbar.class, "ListBundleName")); // NOI18N
255  listsButton.setBorderPainted(false);
256  listsButton.setContentAreaFilled(false);
257  listsButton.setEnabled(false);
258  listsButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-rollover.png"))); // NOI18N NON-NLS
259  listsButton.setRolloverSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-pressed.png"))); // NOI18N NON-NLS
260  listsButton.addMouseListener(new java.awt.event.MouseAdapter() {
261  public void mousePressed(java.awt.event.MouseEvent evt) {
262  listsButtonMousePressed(evt);
263  }
264  });
265  listsButton.addActionListener(new java.awt.event.ActionListener() {
266  public void actionPerformed(java.awt.event.ActionEvent evt) {
267  listsButtonActionPerformed(evt);
268  }
269  });
270 
271  searchDropButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon.png"))); // NOI18N NON-NLS
272  searchDropButton.setText(org.openide.util.NbBundle.getMessage(DropdownToolbar.class, "KeywordSearchPanel.searchDropButton.text")); // NOI18N
273  searchDropButton.setBorderPainted(false);
274  searchDropButton.setContentAreaFilled(false);
275  searchDropButton.setEnabled(false);
276  searchDropButton.setMaximumSize(new java.awt.Dimension(146, 27));
277  searchDropButton.setMinimumSize(new java.awt.Dimension(146, 27));
278  searchDropButton.setPreferredSize(new java.awt.Dimension(146, 27));
279  searchDropButton.setRolloverIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-rollover.png"))); // NOI18N NON-NLS
280  searchDropButton.setRolloverSelectedIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-pressed.png"))); // NOI18N NON-NLS
281  searchDropButton.addMouseListener(new java.awt.event.MouseAdapter() {
282  public void mousePressed(java.awt.event.MouseEvent evt) {
283  searchDropButtonMousePressed(evt);
284  }
285  });
286 
287  jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
288 
289  javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
290  this.setLayout(layout);
291  layout.setHorizontalGroup(
292  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
293  .addGroup(layout.createSequentialGroup()
294  .addComponent(listsButton)
295  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
296  .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 7, javax.swing.GroupLayout.PREFERRED_SIZE)
297  .addGap(0, 0, 0)
298  .addComponent(searchDropButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
299  .addContainerGap())
300  );
301  layout.setVerticalGroup(
302  layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
303  .addGroup(layout.createSequentialGroup()
304  .addGap(0, 0, Short.MAX_VALUE)
305  .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
306  .addComponent(listsButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
307  .addComponent(searchDropButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
308  .addComponent(jSeparator1)))
309  );
310  }// </editor-fold>//GEN-END:initComponents
311 
312  private void listsButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_listsButtonMousePressed
313  maybeShowListsPopup(evt);
314  }//GEN-LAST:event_listsButtonMousePressed
315 
316  private void listsButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_listsButtonActionPerformed
317  // TODO add your handling code here:
318  }//GEN-LAST:event_listsButtonActionPerformed
319 
320  private void searchDropButtonMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_searchDropButtonMousePressed
321  maybeShowSearchPopup(evt);
322  }//GEN-LAST:event_searchDropButtonMousePressed
323 
324  // Variables declaration - do not modify//GEN-BEGIN:variables
325  private javax.swing.JSeparator jSeparator1;
326  private javax.swing.JButton listsButton;
327  private javax.swing.JPopupMenu listsMenu;
328  private javax.swing.JButton searchDropButton;
329  private javax.swing.JPopupMenu searchMenu;
330  // End of variables declaration//GEN-END:variables
331 
332 }
static void fireNumIndexedFilesChange(Integer oldNum, Integer newNum)
synchronized static Logger getLogger(String name)
Definition: Logger.java:124

Copyright © 2012-2016 Basis Technology. Generated on: Tue Feb 20 2018
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.