19package org.sleuthkit.autopsy.keywordsearch;
21import java.awt.event.ActionEvent;
22import java.awt.event.ActionListener;
23import java.awt.event.MouseEvent;
24import java.beans.PropertyChangeEvent;
25import java.beans.PropertyChangeListener;
26import java.util.ArrayList;
27import java.util.EnumSet;
29import java.util.logging.Level;
30import javax.swing.SwingUtilities;
31import javax.swing.event.PopupMenuEvent;
32import javax.swing.event.PopupMenuListener;
33import org.sleuthkit.autopsy.casemodule.Case;
34import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
35import org.sleuthkit.autopsy.core.RuntimeProperties;
36import org.sleuthkit.autopsy.coreutils.Logger;
37import org.sleuthkit.datamodel.DataSource;
38import org.sleuthkit.datamodel.TskCoreException;
45@SuppressWarnings(
"PMD.SingularField")
46class DropdownToolbar extends javax.swing.JPanel {
48 private static final long serialVersionUID = 1L;
50 private static DropdownToolbar instance;
51 private SearchSettingsChangeListener searchSettingsChangeListener;
52 private boolean active =
false;
54 private DropdownListSearchPanel listsPanel =
null;
55 private List<DataSource> dataSources =
new ArrayList<>();
63 public synchronized static DropdownToolbar getDefault() {
64 if (instance ==
null) {
65 instance =
new DropdownToolbar();
75 private DropdownToolbar() {
77 customizeComponents();
84 private void customizeComponents() {
85 searchSettingsChangeListener =
new SearchSettingsChangeListener();
89 listsPanel = DropdownListSearchPanel.getDefault();
90 listsPanel.addSearchButtonActionListener((ActionEvent e) -> {
91 listsMenu.setVisible(
false);
93 listsPanel.addPropertyChangeListener(searchSettingsChangeListener);
95 listsMenu.setSize(listsPanel.getPreferredSize().width + 6, listsPanel.getPreferredSize().height + 6);
96 listsMenu.add(listsPanel);
97 listsMenu.addPopupMenuListener(
new PopupMenuListener() {
99 public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
100 listsButton.setSelected(
true);
104 public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
105 listsButton.setSelected(
false);
109 public void popupMenuCanceled(PopupMenuEvent e) {
110 listsButton.setSelected(
false);
115 dropPanel.addPropertyChangeListener(searchSettingsChangeListener);
116 dropPanel.addSearchButtonActionListener(
new ActionListener() {
118 public void actionPerformed(ActionEvent e) {
119 searchMenu.setVisible(
false);
122 searchMenu.setSize(dropPanel.getPreferredSize().width + 6, dropPanel.getPreferredSize().height + 6);
123 searchMenu.add(dropPanel);
124 searchMenu.addPopupMenuListener(
new PopupMenuListener() {
126 public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
127 searchDropButton.setSelected(
true);
131 public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
132 searchDropButton.setSelected(
false);
136 public void popupMenuCanceled(PopupMenuEvent e) {
137 searchDropButton.setSelected(
false);
143 private void maybeShowListsPopup(MouseEvent evt) {
144 if (!active || !listsButton.isEnabled()) {
147 if (evt !=
null && !SwingUtilities.isLeftMouseButton(evt)) {
150 listsPanel.setDataSources(dataSources);
151 listsPanel.updateDataSourceListModel();
152 listsMenu.show(listsButton, listsButton.getWidth() - listsMenu.getWidth(), listsButton.getHeight() - 1);
155 private void maybeShowSearchPopup(MouseEvent evt) {
156 if (!active || !searchDropButton.isEnabled()) {
159 if (evt !=
null && !SwingUtilities.isLeftMouseButton(evt)) {
162 dropPanel.setDataSources(dataSources);
163 dropPanel.updateDataSourceListModel();
164 searchMenu.show(searchDropButton, searchDropButton.getWidth() - searchMenu.getWidth(), searchDropButton.getHeight() - 1);
172 String changed = evt.getPropertyName();
174 if (
null != evt.getNewValue()) {
175 boolean disableSearch =
false;
181 if (server.coreIsOpen() ==
false) {
182 disableSearch =
true;
185 Index indexInfo = server.getIndexInfo();
188 boolean schemaIsCompatible = indexInfo.isCompatible(IndexFinder.getCurrentSchemaVersion());
189 if (!schemaIsCompatible) {
190 logger.log(Level.WARNING,
"Text index schema version {0} is not compatible with current schema", indexInfo.getSchemaVersion());
191 disableSearch =
true;
193 listsButton.setEnabled(
true);
194 searchDropButton.setEnabled(
true);
195 dropPanel.setRegexSearchEnabled(
true);
203 logger.log(Level.SEVERE,
"Error getting text index info", ex);
204 disableSearch =
true;
209 dataSources = getDataSourceList();
210 }
catch (TskCoreException ex) {
211 logger.log(Level.SEVERE,
"Error getting text index info", ex);
212 disableSearch =
true;
214 logger.log(Level.SEVERE,
"Exception while getting current case.", ex);
215 disableSearch =
true;
218 searchDropButton.setEnabled(
false);
219 listsButton.setEnabled(
false);
227 dropPanel.clearSearchBox();
228 searchDropButton.setEnabled(
false);
229 listsButton.setEnabled(
false);
240 logger.log(Level.SEVERE,
"Error executing Solr query", ex);
248 DataSource newDataSource = (DataSource) evt.getNewValue();
249 dataSources.add(newDataSource);
261 private synchronized List<DataSource> getDataSourceList() throws
NoCurrentCaseException, TskCoreException {
270 @SuppressWarnings(
"unchecked")
272 private
void initComponents() {
274 listsMenu =
new javax.swing.JPopupMenu();
275 searchMenu =
new javax.swing.JPopupMenu();
276 listsButton =
new javax.swing.JButton();
277 searchDropButton =
new javax.swing.JButton();
278 jSeparator1 =
new javax.swing.JSeparator();
282 listsButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon.png")));
283 listsButton.setText(org.openide.util.NbBundle.getMessage(DropdownToolbar.class,
"ListBundleName"));
284 listsButton.setBorderPainted(
false);
285 listsButton.setContentAreaFilled(
false);
286 listsButton.setEnabled(
false);
287 listsButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-rollover.png")));
288 listsButton.setRolloverSelectedIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/watchbutton-icon-pressed.png")));
289 listsButton.addMouseListener(
new java.awt.event.MouseAdapter() {
290 public void mousePressed(java.awt.event.MouseEvent evt) {
291 listsButtonMousePressed(evt);
294 listsButton.addActionListener(
new java.awt.event.ActionListener() {
295 public void actionPerformed(java.awt.event.ActionEvent evt) {
296 listsButtonActionPerformed(evt);
300 searchDropButton.setIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon.png")));
301 searchDropButton.setText(org.openide.util.NbBundle.getMessage(DropdownToolbar.class,
"KeywordSearchPanel.searchDropButton.text"));
302 searchDropButton.setBorderPainted(
false);
303 searchDropButton.setContentAreaFilled(
false);
304 searchDropButton.setEnabled(
false);
305 searchDropButton.setMaximumSize(
new java.awt.Dimension(146, 27));
306 searchDropButton.setMinimumSize(
new java.awt.Dimension(146, 27));
307 searchDropButton.setRolloverIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-rollover.png")));
308 searchDropButton.setRolloverSelectedIcon(
new javax.swing.ImageIcon(getClass().getResource(
"/org/sleuthkit/autopsy/keywordsearch/searchbutton-icon-pressed.png")));
309 searchDropButton.addMouseListener(
new java.awt.event.MouseAdapter() {
310 public void mousePressed(java.awt.event.MouseEvent evt) {
311 searchDropButtonMousePressed(evt);
315 jSeparator1.setOrientation(javax.swing.SwingConstants.VERTICAL);
317 javax.swing.GroupLayout layout =
new javax.swing.GroupLayout(
this);
318 this.setLayout(layout);
319 layout.setHorizontalGroup(
320 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
321 .addGroup(layout.createSequentialGroup()
322 .addComponent(listsButton)
323 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
324 .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 7, javax.swing.GroupLayout.PREFERRED_SIZE)
326 .addComponent(searchDropButton, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
329 layout.setVerticalGroup(
330 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
331 .addGroup(layout.createSequentialGroup()
332 .addGap(0, 0, Short.MAX_VALUE)
333 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING,
false)
334 .addComponent(listsButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
335 .addComponent(searchDropButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
336 .addComponent(jSeparator1)))
340 private void listsButtonMousePressed(java.awt.event.MouseEvent evt) {
341 maybeShowListsPopup(evt);
344 private void listsButtonActionPerformed(java.awt.event.ActionEvent evt) {
348 private void searchDropButtonMousePressed(java.awt.event.MouseEvent evt) {
349 maybeShowSearchPopup(evt);
353 private javax.swing.JSeparator jSeparator1;
354 private javax.swing.JButton listsButton;
355 private javax.swing.JPopupMenu listsMenu;
356 private javax.swing.JButton searchDropButton;
357 private javax.swing.JPopupMenu searchMenu;
SleuthkitCase getSleuthkitCase()
static Case getCurrentCaseThrows()
static void addEventTypeSubscriber(Set< Events > eventTypes, PropertyChangeListener subscriber)
static boolean runningWithGUI
synchronized static Logger getLogger(String name)
static synchronized DropdownSingleTermSearchPanel getDefault()
static synchronized Server getServer()
static void fireNumIndexedFilesChange(Integer oldNum, Integer newNum)
void addServerActionListener(PropertyChangeListener l)
int queryNumIndexedFiles()
static final String CORE_EVT