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

Copyright © 2012-2016 Basis Technology. Generated on: Mon Apr 24 2017
This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.