| /* |
| * 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.lucene.luke.app.desktop.components.dialog.documents; |
| |
| import javax.swing.BorderFactory; |
| import javax.swing.BoxLayout; |
| import javax.swing.JButton; |
| import javax.swing.JCheckBox; |
| import javax.swing.JComboBox; |
| import javax.swing.JDialog; |
| import javax.swing.JLabel; |
| import javax.swing.JPanel; |
| import javax.swing.JSeparator; |
| import javax.swing.JTextField; |
| import java.awt.Dialog; |
| import java.awt.Dimension; |
| import java.awt.FlowLayout; |
| import java.awt.Insets; |
| import java.awt.Window; |
| import java.io.IOException; |
| import java.util.Arrays; |
| |
| import org.apache.lucene.document.Field; |
| import org.apache.lucene.document.FieldType; |
| import org.apache.lucene.document.StringField; |
| import org.apache.lucene.index.DocValuesType; |
| import org.apache.lucene.index.IndexOptions; |
| import org.apache.lucene.index.IndexableFieldType; |
| import org.apache.lucene.luke.app.desktop.Preferences; |
| import org.apache.lucene.luke.app.desktop.PreferencesFactory; |
| import org.apache.lucene.luke.app.desktop.dto.documents.NewField; |
| import org.apache.lucene.luke.app.desktop.util.DialogOpener; |
| import org.apache.lucene.luke.app.desktop.util.MessageUtils; |
| |
| /** Factory of index options dialog */ |
| public final class IndexOptionsDialogFactory implements DialogOpener.DialogFactory { |
| |
| private static IndexOptionsDialogFactory instance; |
| |
| private final Preferences prefs; |
| |
| private final JCheckBox storedCB = new JCheckBox(); |
| |
| private final JCheckBox tokenizedCB = new JCheckBox(); |
| |
| private final JCheckBox omitNormsCB = new JCheckBox(); |
| |
| private final JComboBox<String> idxOptCombo = new JComboBox<>(availableIndexOptions()); |
| |
| private final JCheckBox storeTVCB = new JCheckBox(); |
| |
| private final JCheckBox storeTVPosCB = new JCheckBox(); |
| |
| private final JCheckBox storeTVOffCB = new JCheckBox(); |
| |
| private final JCheckBox storeTVPayCB = new JCheckBox(); |
| |
| private final JComboBox<String> dvTypeCombo = new JComboBox<>(availableDocValuesType()); |
| |
| private final JTextField dimCountTF = new JTextField(); |
| |
| private final JTextField dimNumBytesTF = new JTextField(); |
| |
| private JDialog dialog; |
| |
| private NewField nf; |
| |
| public synchronized static IndexOptionsDialogFactory getInstance() throws IOException { |
| if (instance == null) { |
| instance = new IndexOptionsDialogFactory(); |
| } |
| return instance; |
| } |
| |
| private IndexOptionsDialogFactory() throws IOException { |
| this.prefs = PreferencesFactory.getInstance(); |
| initialize(); |
| } |
| |
| private void initialize() { |
| storedCB.setText(MessageUtils.getLocalizedMessage("idx_options.checkbox.stored")); |
| storedCB.setOpaque(false); |
| tokenizedCB.setText(MessageUtils.getLocalizedMessage("idx_options.checkbox.tokenized")); |
| tokenizedCB.setOpaque(false); |
| omitNormsCB.setText(MessageUtils.getLocalizedMessage("idx_options.checkbox.omit_norm")); |
| omitNormsCB.setOpaque(false); |
| idxOptCombo.setPreferredSize(new Dimension(300, idxOptCombo.getPreferredSize().height)); |
| storeTVCB.setText(MessageUtils.getLocalizedMessage("idx_options.checkbox.store_tv")); |
| storeTVCB.setOpaque(false); |
| storeTVPosCB.setText(MessageUtils.getLocalizedMessage("idx_options.checkbox.store_tv_pos")); |
| storeTVPosCB.setOpaque(false); |
| storeTVOffCB.setText(MessageUtils.getLocalizedMessage("idx_options.checkbox.store_tv_off")); |
| storeTVOffCB.setOpaque(false); |
| storeTVPayCB.setText(MessageUtils.getLocalizedMessage("idx_options.checkbox.store_tv_pay")); |
| storeTVPayCB.setOpaque(false); |
| dimCountTF.setColumns(4); |
| dimNumBytesTF.setColumns(4); |
| } |
| |
| @Override |
| public JDialog create(Window owner, String title, int width, int height) { |
| dialog = new JDialog(owner, title, Dialog.ModalityType.APPLICATION_MODAL); |
| dialog.add(content()); |
| dialog.setSize(new Dimension(width, height)); |
| dialog.setLocationRelativeTo(owner); |
| dialog.getContentPane().setBackground(prefs.getColorTheme().getBackgroundColor()); |
| return dialog; |
| } |
| |
| private JPanel content() { |
| JPanel panel = new JPanel(); |
| panel.setOpaque(false); |
| panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); |
| panel.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); |
| |
| panel.add(indexOptions()); |
| panel.add(new JSeparator(JSeparator.HORIZONTAL)); |
| panel.add(tvOptions()); |
| panel.add(new JSeparator(JSeparator.HORIZONTAL)); |
| panel.add(dvOptions()); |
| panel.add(new JSeparator(JSeparator.HORIZONTAL)); |
| panel.add(pvOptions()); |
| panel.add(new JSeparator(JSeparator.HORIZONTAL)); |
| panel.add(footer()); |
| return panel; |
| } |
| |
| private JPanel indexOptions() { |
| JPanel panel = new JPanel(); |
| panel.setOpaque(false); |
| panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); |
| |
| JPanel inner1 = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 5)); |
| inner1.setOpaque(false); |
| inner1.add(storedCB); |
| |
| inner1.add(tokenizedCB); |
| inner1.add(omitNormsCB); |
| panel.add(inner1); |
| |
| JPanel inner2 = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 1)); |
| inner2.setOpaque(false); |
| JLabel idxOptLbl = new JLabel(MessageUtils.getLocalizedMessage("idx_options.label.index_options")); |
| inner2.add(idxOptLbl); |
| inner2.add(idxOptCombo); |
| panel.add(inner2); |
| |
| return panel; |
| } |
| |
| private JPanel tvOptions() { |
| JPanel panel = new JPanel(); |
| panel.setOpaque(false); |
| panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); |
| |
| JPanel inner1 = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 2)); |
| inner1.setOpaque(false); |
| inner1.add(storeTVCB); |
| panel.add(inner1); |
| |
| JPanel inner2 = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 2)); |
| inner2.setOpaque(false); |
| inner2.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); |
| inner2.add(storeTVPosCB); |
| inner2.add(storeTVOffCB); |
| inner2.add(storeTVPayCB); |
| panel.add(inner2); |
| |
| return panel; |
| } |
| |
| private JPanel dvOptions() { |
| JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 2)); |
| panel.setOpaque(false); |
| JLabel dvTypeLbl = new JLabel(MessageUtils.getLocalizedMessage("idx_options.label.dv_type")); |
| panel.add(dvTypeLbl); |
| panel.add(dvTypeCombo); |
| return panel; |
| } |
| |
| private JPanel pvOptions() { |
| JPanel panel = new JPanel(); |
| panel.setOpaque(false); |
| panel.setLayout(new BoxLayout(panel, BoxLayout.PAGE_AXIS)); |
| |
| JPanel inner1 = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 2)); |
| inner1.setOpaque(false); |
| inner1.add(new JLabel(MessageUtils.getLocalizedMessage("idx_options.label.point_dims"))); |
| panel.add(inner1); |
| |
| JPanel inner2 = new JPanel(new FlowLayout(FlowLayout.LEADING, 10, 2)); |
| inner2.setOpaque(false); |
| inner2.setBorder(BorderFactory.createEmptyBorder(0, 10, 0, 0)); |
| inner2.add(new JLabel(MessageUtils.getLocalizedMessage("idx_options.label.point_dc"))); |
| inner2.add(dimCountTF); |
| inner2.add(new JLabel(MessageUtils.getLocalizedMessage("idx_options.label.point_nb"))); |
| inner2.add(dimNumBytesTF); |
| panel.add(inner2); |
| |
| return panel; |
| } |
| |
| private JPanel footer() { |
| JPanel panel = new JPanel(new FlowLayout(FlowLayout.TRAILING)); |
| panel.setOpaque(false); |
| JButton okBtn = new JButton(MessageUtils.getLocalizedMessage("button.ok")); |
| okBtn.setMargin(new Insets(3, 3, 3, 3)); |
| okBtn.addActionListener(e -> saveOptions()); |
| panel.add(okBtn); |
| JButton cancelBtn = new JButton(MessageUtils.getLocalizedMessage("button.cancel")); |
| cancelBtn.setMargin(new Insets(3, 3, 3, 3)); |
| cancelBtn.addActionListener(e -> dialog.dispose()); |
| panel.add(cancelBtn); |
| |
| return panel; |
| } |
| |
| // control methods |
| |
| public void setNewField(NewField nf) { |
| this.nf = nf; |
| |
| storedCB.setSelected(nf.isStored()); |
| |
| IndexableFieldType fieldType = nf.getFieldType(); |
| tokenizedCB.setSelected(fieldType.tokenized()); |
| omitNormsCB.setSelected(fieldType.omitNorms()); |
| idxOptCombo.setSelectedItem(fieldType.indexOptions().name()); |
| storeTVCB.setSelected(fieldType.storeTermVectors()); |
| storeTVPosCB.setSelected(fieldType.storeTermVectorPositions()); |
| storeTVOffCB.setSelected(fieldType.storeTermVectorOffsets()); |
| storeTVPayCB.setSelected(fieldType.storeTermVectorPayloads()); |
| dvTypeCombo.setSelectedItem(fieldType.docValuesType().name()); |
| dimCountTF.setText(String.valueOf(fieldType.pointDimensionCount())); |
| dimNumBytesTF.setText(String.valueOf(fieldType.pointNumBytes())); |
| |
| if (nf.getType().equals(org.apache.lucene.document.TextField.class) || |
| nf.getType().equals(StringField.class) || |
| nf.getType().equals(Field.class)) { |
| storedCB.setEnabled(true); |
| } else { |
| storedCB.setEnabled(false); |
| } |
| |
| if (nf.getType().equals(Field.class)) { |
| tokenizedCB.setEnabled(true); |
| omitNormsCB.setEnabled(true); |
| idxOptCombo.setEnabled(true); |
| storeTVCB.setEnabled(true); |
| storeTVPosCB.setEnabled(true); |
| storeTVOffCB.setEnabled(true); |
| storeTVPosCB.setEnabled(true); |
| } else { |
| tokenizedCB.setEnabled(false); |
| omitNormsCB.setEnabled(false); |
| idxOptCombo.setEnabled(false); |
| storeTVCB.setEnabled(false); |
| storeTVPosCB.setEnabled(false); |
| storeTVOffCB.setEnabled(false); |
| storeTVPayCB.setEnabled(false); |
| } |
| |
| // TODO |
| dvTypeCombo.setEnabled(false); |
| dimCountTF.setEnabled(false); |
| dimNumBytesTF.setEnabled(false); |
| } |
| |
| private void saveOptions() { |
| nf.setStored(storedCB.isSelected()); |
| if (nf.getType().equals(Field.class)) { |
| FieldType ftype = (FieldType) nf.getFieldType(); |
| ftype.setStored(storedCB.isSelected()); |
| ftype.setTokenized(tokenizedCB.isSelected()); |
| ftype.setOmitNorms(omitNormsCB.isSelected()); |
| ftype.setIndexOptions(IndexOptions.valueOf((String) idxOptCombo.getSelectedItem())); |
| ftype.setStoreTermVectors(storeTVCB.isSelected()); |
| ftype.setStoreTermVectorPositions(storeTVPosCB.isSelected()); |
| ftype.setStoreTermVectorOffsets(storeTVOffCB.isSelected()); |
| ftype.setStoreTermVectorPayloads(storeTVPayCB.isSelected()); |
| } |
| dialog.dispose(); |
| } |
| |
| private static String[] availableIndexOptions() { |
| return Arrays.stream(IndexOptions.values()).map(IndexOptions::name).toArray(String[]::new); |
| } |
| |
| private static String[] availableDocValuesType() { |
| return Arrays.stream(DocValuesType.values()).map(DocValuesType::name).toArray(String[]::new); |
| } |
| |
| } |