blob: faf5c1c1e278c7816de5c5468892cef1615eb823 [file] [log] [blame]
/*
* 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;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.WindowConstants;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.io.IOException;
import org.apache.lucene.luke.app.DirectoryHandler;
import org.apache.lucene.luke.app.DirectoryObserver;
import org.apache.lucene.luke.app.IndexHandler;
import org.apache.lucene.luke.app.IndexObserver;
import org.apache.lucene.luke.app.LukeState;
import org.apache.lucene.luke.app.desktop.MessageBroker;
import org.apache.lucene.luke.app.desktop.Preferences;
import org.apache.lucene.luke.app.desktop.PreferencesFactory;
import org.apache.lucene.luke.app.desktop.util.FontUtils;
import org.apache.lucene.luke.app.desktop.util.ImageUtils;
import org.apache.lucene.luke.app.desktop.util.MessageUtils;
import org.apache.lucene.luke.app.desktop.util.TextAreaAppender;
import org.apache.lucene.util.Version;
/** Provider of the root window */
public final class LukeWindowProvider implements LukeWindowOperator {
private static final String WINDOW_TITLE = MessageUtils.getLocalizedMessage("window.title") + " - v" + Version.LATEST.toString();
private final Preferences prefs;
private final MessageBroker messageBroker;
private final TabSwitcherProxy tabSwitcher;
private final JMenuBar menuBar;
private final JTabbedPane tabbedPane;
private final JLabel messageLbl = new JLabel();
private final JLabel multiIcon = new JLabel();
private final JLabel readOnlyIcon = new JLabel();
private final JLabel noReaderIcon = new JLabel();
private JFrame frame = new JFrame();
public LukeWindowProvider() throws IOException {
// prepare log4j appender for Logs tab.
JTextArea logTextArea = new JTextArea();
logTextArea.setEditable(false);
TextAreaAppender.setTextArea(logTextArea);
this.prefs = PreferencesFactory.getInstance();
this.menuBar = new MenuBarProvider().get();
this.tabbedPane = new TabbedPaneProvider(logTextArea).get();
this.messageBroker = MessageBroker.getInstance();
this.tabSwitcher = TabSwitcherProxy.getInstance();
ComponentOperatorRegistry.getInstance().register(LukeWindowOperator.class, this);
Observer observer = new Observer();
DirectoryHandler.getInstance().addObserver(observer);
IndexHandler.getInstance().addObserver(observer);
messageBroker.registerReceiver(new MessageReceiverImpl());
}
public JFrame get() {
frame.setTitle(WINDOW_TITLE);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setJMenuBar(menuBar);
frame.add(initMainPanel(), BorderLayout.CENTER);
frame.add(initMessagePanel(), BorderLayout.PAGE_END);
frame.setPreferredSize(new Dimension(950, 680));
frame.getContentPane().setBackground(prefs.getColorTheme().getBackgroundColor());
return frame;
}
private JPanel initMainPanel() {
JPanel panel = new JPanel(new GridLayout(1, 1));
tabbedPane.setEnabledAt(TabbedPaneProvider.Tab.OVERVIEW.index(), false);
tabbedPane.setEnabledAt(TabbedPaneProvider.Tab.DOCUMENTS.index(), false);
tabbedPane.setEnabledAt(TabbedPaneProvider.Tab.SEARCH.index(), false);
tabbedPane.setEnabledAt(TabbedPaneProvider.Tab.COMMITS.index(), false);
panel.add(tabbedPane);
panel.setOpaque(false);
return panel;
}
private JPanel initMessagePanel() {
JPanel panel = new JPanel(new GridLayout(1, 1));
panel.setOpaque(false);
panel.setBorder(BorderFactory.createEmptyBorder(0, 2, 2, 2));
JPanel innerPanel = new JPanel(new GridBagLayout());
innerPanel.setOpaque(false);
innerPanel.setBorder(BorderFactory.createLineBorder(Color.gray));
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
JPanel msgPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
msgPanel.setOpaque(false);
msgPanel.add(messageLbl);
c.gridx = 0;
c.gridy = 0;
c.weightx = 0.8;
innerPanel.add(msgPanel, c);
JPanel iconPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
iconPanel.setOpaque(false);
multiIcon.setText(FontUtils.elegantIconHtml(""));
multiIcon.setToolTipText(MessageUtils.getLocalizedMessage("tooltip.multi_reader"));
multiIcon.setVisible(false);
iconPanel.add(multiIcon);
readOnlyIcon.setText(FontUtils.elegantIconHtml(""));
readOnlyIcon.setToolTipText(MessageUtils.getLocalizedMessage("tooltip.read_only"));
readOnlyIcon.setVisible(false);
iconPanel.add(readOnlyIcon);
noReaderIcon.setText(FontUtils.elegantIconHtml(""));
noReaderIcon.setToolTipText(MessageUtils.getLocalizedMessage("tooltip.no_reader"));
noReaderIcon.setVisible(false);
iconPanel.add(noReaderIcon);
JLabel luceneIcon = new JLabel(ImageUtils.createImageIcon("lucene.gif", "lucene", 16, 16));
iconPanel.add(luceneIcon);
c.gridx = 1;
c.gridy = 0;
c.weightx = 0.2;
innerPanel.add(iconPanel);
panel.add(innerPanel);
return panel;
}
@Override
public void setColorTheme(Preferences.ColorTheme theme) {
frame.getContentPane().setBackground(theme.getBackgroundColor());
}
private class Observer implements IndexObserver, DirectoryObserver {
@Override
public void openDirectory(LukeState state) {
multiIcon.setVisible(false);
readOnlyIcon.setVisible(false);
noReaderIcon.setVisible(true);
tabSwitcher.switchTab(TabbedPaneProvider.Tab.COMMITS);
messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("message.directory_opened"));
}
@Override
public void closeDirectory() {
multiIcon.setVisible(false);
readOnlyIcon.setVisible(false);
noReaderIcon.setVisible(false);
messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("message.directory_closed"));
}
@Override
public void openIndex(LukeState state) {
multiIcon.setVisible(!state.hasDirectoryReader());
readOnlyIcon.setVisible(state.readOnly());
noReaderIcon.setVisible(false);
if (state.readOnly()) {
messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("message.index_opened_ro"));
} else if (!state.hasDirectoryReader()) {
messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("message.index_opened_multi"));
} else {
messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("message.index_opened"));
}
}
@Override
public void closeIndex() {
multiIcon.setVisible(false);
readOnlyIcon.setVisible(false);
noReaderIcon.setVisible(false);
messageBroker.showStatusMessage(MessageUtils.getLocalizedMessage("message.index_closed"));
}
}
private class MessageReceiverImpl implements MessageBroker.MessageReceiver {
@Override
public void showStatusMessage(String message) {
messageLbl.setText(message);
}
@Override
public void showUnknownErrorMessage() {
messageLbl.setText(MessageUtils.getLocalizedMessage("message.error.unknown"));
}
@Override
public void clearStatusMessage() {
messageLbl.setText("");
}
private MessageReceiverImpl() {
}
}
}