/**
* Copyright (c) 2009 Juwi MacMillan Group GmbH
*
* Licensed 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 de.juwimm.cms.gui.views;
import static de.juwimm.cms.client.beans.Application.getBean;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ResourceBundle;
import javax.swing.AbstractAction;
import javax.swing.ButtonGroup;
import javax.swing.ComponentInputMap;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.KeyStroke;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.tree.TreePath;
import org.apache.log4j.Logger;
import org.jvnet.flamingo.common.JCommandButton;
import org.jvnet.flamingo.common.icon.ImageWrapperResizableIcon;
import de.juwimm.cms.Main;
import de.juwimm.cms.Messages;
import de.juwimm.cms.client.beans.Beans;
import de.juwimm.cms.common.Constants;
import de.juwimm.cms.common.UserRights;
import de.juwimm.cms.exceptions.ViewComponentLinkNameAlreadyExisting;
import de.juwimm.cms.exceptions.ViewComponentLinkNameIsEmptyException;
import de.juwimm.cms.exceptions.ViewComponentNotFound;
import de.juwimm.cms.gui.controls.LoadableViewComponentPanel;
import de.juwimm.cms.gui.ribbon.CommandButton;
import de.juwimm.cms.gui.views.menuentry.PanMenuentryContent;
import de.juwimm.cms.gui.views.page.PanelContent;
import de.juwimm.cms.gui.views.page.PanelMetaData;
import de.juwimm.cms.gui.views.page.PanelSafeGuard;
import de.juwimm.cms.util.ActionHub;
import de.juwimm.cms.util.Communication;
import de.juwimm.cms.util.Parameters;
import de.juwimm.cms.util.PropertyConfigurationEvent;
import de.juwimm.cms.util.UIConstants;
import de.juwimm.cms.vo.ViewComponentValue;
import de.juwimm.swing.NoResizeScrollPane;
/**
* <p>Title: Tizzit </p>
* <p>Description: Content Management System</p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: JuwiMacMillan Group GmbH</p>
* @author <a href="mailto:s.kulawik@juwimm.com">Sascha-Matthias Kulawik</a>
* @version $Id$
*/
public final class PanContentView extends JPanel implements LoadableViewComponentPanel, ActionListener {
private static final long serialVersionUID = 1043431871885717071L;
private static Logger log = Logger.getLogger(PanContentView.class);
private final Communication comm = ((Communication) getBean(Beans.COMMUNICATION));
private final ResourceBundle rb = Constants.rb;
private volatile ViewComponentValue viewComponent;
private final JTabbedPane panTab = new JTabbedPane();
private PanMenuentryContent panMenuentry;
private PanelContent panContent;
private PanelMetaData panMetaData;
private final JPanel panXmlData = new JPanel();
private PanelSafeGuard panSafeGuard;
private final JPanel panBottom = new JPanel();
private JCommandButton btnSave;
private JCommandButton btnCancel;
private JCommandButton btnPreview;
private final JScrollPane spXmlText = new NoResizeScrollPane();
private final JEditorPane txtEditor = new JEditorPane(); // for "XML"-Tab
private final JRadioButton radioPreviewFrameset = new JRadioButton();
private final JRadioButton radioPreviewWithoutFrame = new JRadioButton();
private final ButtonGroup bGrp = new ButtonGroup();
private static PanContentView instance = null;
private boolean saveStatus = true;
private TreePath treeNode;
private boolean isFromSaveButton = false;
public static PanContentView getInstance() {
if (instance == null) {
instance = new PanContentView();
}
return instance;
}
private PanContentView() {
try {
panMenuentry = new PanMenuentryContent();
panContent = new PanelContent(this);
panMetaData = new PanelMetaData();
panSafeGuard = new PanelSafeGuard();
this.btnCancel = new CommandButton(rb.getString("dialog.cancel"), ImageWrapperResizableIcon.getIcon(UIConstants.RIBBON_CLOSE.getImage(), new Dimension(32, 32)));
this.btnCancel.setPreferredSize(new Dimension(55, 55));
this.btnSave = new CommandButton(rb.getString("dialog.save"), ImageWrapperResizableIcon.getIcon(UIConstants.RIBBON_SAVE.getImage(), new Dimension(32, 32)));
this.btnSave.setPreferredSize(new Dimension(55, 55));
this.btnPreview = new CommandButton(rb.getString("dialog.preview"), ImageWrapperResizableIcon.getIcon(UIConstants.RIBBON_PREVIEW.getImage(), new Dimension(32, 32)));
this.btnPreview.setPreferredSize(new Dimension(55, 55));
jbInit();
this.radioPreviewFrameset.setText(rb.getString("panel.toolContent.previewInFrameset"));
this.radioPreviewWithoutFrame.setText(rb.getString("panel.toolContent.previewWithoutFrameset"));
//btnSave.setMnemonic(KeyEvent.VK_S);
//btnSave.setDisplayedMnemonicIndex(0);
ComponentInputMap im = new ComponentInputMap(this);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK), "saveContent");
this.setInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW, im);
this.getActionMap().put("saveContent", new AbstractAction() {
private static final long serialVersionUID = -8417253327858948035L;
public void actionPerformed(ActionEvent e) {
Main.getInstance().freezeInput(true);
save();
}
});
} catch (Exception exe) {
log.error("Initialization Error", exe);
}
}
public synchronized void reload() {
panTab.removeAll();
panTab.add(panMenuentry, rb.getString("panel.toolContent.tab.menuentry"));
panTab.add(panContent, rb.getString("panel.toolContent.tab.content"));
if (comm.isUserInRole(UserRights.PAGE_VIEW_METADATA)) {
panTab.add(panMetaData, rb.getString("panel.toolContent.tab.metadata"));
}
if (comm.isUserInRole(UserRights.SITE_ROOT)) {
panXmlData.setLayout(new BorderLayout());
panXmlData.add(spXmlText, BorderLayout.CENTER);
spXmlText.getViewport().add(txtEditor, null);
panTab.add(panXmlData, rb.getString("panel.toolContent.tab.xml"));
this.setXmlEditListener();
}
if ((comm.isUserInRole(UserRights.MANAGE_SAFEGUARD))
// || (comm.isUserInRole(UserRights.SITE_ROOT)) at present no customer may see this tab !!!
|| (comm.getUser().isMasterRoot())) {
panTab.add(this.panSafeGuard, rb.getString("panel.toolContent.tab.safeguard"));
}
}
private void jbInit() throws Exception {
this.setLayout(new BorderLayout());
ActionHub.addActionListener(this);
btnSave.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
Main.getInstance().freezeInput(true);
if (log.isDebugEnabled()) log.debug("btnSave actionPerformed");
btnSave.setEnabled(false);
Constants.EDIT_CONTENT = false;
Constants.SHOW_CONTENT_FROM_DROPDOWN = true;
isFromSaveButton = true;
save();
btnSave.setEnabled(true);
}
});
btnCancel.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
cmdCancelActionPerformed(e);
}
});
panBottom.setLayout(new GridBagLayout());
btnPreview.setEnabled(true);
btnPreview.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
btnPreviewActionPerformed(e);
}
});
radioPreviewFrameset.setText("Preview in Frameset");
radioPreviewFrameset.setBackground(new Color(175, 186, 192));
radioPreviewWithoutFrame.setSelected(true);
radioPreviewWithoutFrame.setText("Preview without Frame");
radioPreviewWithoutFrame.setBackground(new Color(175, 186, 192));
panBottom.setMinimumSize(new Dimension(540, 40));
panBottom.setBackground(new Color(175, 186, 192));
this.add(panTab, BorderLayout.CENTER);
this.add(panBottom, BorderLayout.SOUTH);
panBottom.add(btnSave, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(5, 5, 5, 2), 0, 0));
panBottom.add(btnCancel, new GridBagConstraints(4, 0, 1, 1, 1.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(5, 0, 5, 5), 0, 0));
panBottom.add(btnPreview, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 2, 0, 0), 0, 0));
panBottom.add(radioPreviewFrameset, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
panBottom.add(radioPreviewWithoutFrame, new GridBagConstraints(3, 0, 1, 1, 0.0, 0.0, GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0));
panTab.addChangeListener(new MyChangeListener(this));
bGrp.add(radioPreviewFrameset);
bGrp.add(radioPreviewWithoutFrame);
}
private final void setXmlEditListener() {
try {
txtEditor.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent ke) {
if (!Constants.EDIT_CONTENT) {
Constants.EDIT_CONTENT = true;
}
}
});
} catch (Exception ex) {
}
}
/**
* @author <a href="sascha.kulawik@juwimm.com">Sascha-Matthias Kulawik</a>
* @version $Id$
*/
private class MyChangeListener implements ChangeListener {
private int lastIndex = -1;
public MyChangeListener(PanContentView panContentView) {
}
public void stateChanged(ChangeEvent e) {
UIConstants.setWorker(true);
if (Constants.EDIT_CONTENT && lastIndex == 1) {
int i = JOptionPane.showConfirmDialog(panTab, rb.getString("dialog.wantToSave"), rb.getString("dialog.title"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (i == JOptionPane.YES_OPTION) {
panContent.save();
if (!getSaveStatus()) {
return;
}
}
Constants.EDIT_CONTENT = false;
}
if (lastIndex == 1) {
panContent.unload();
} /*else if (lastIndex == 0) {
panMenuentry.unload();
} else if (lastIndex == 2) {
panMetaData.unload();
}*/
String strTabName = "";
try {
strTabName = panTab.getTitleAt(panTab.getSelectedIndex());
} catch (Exception ex) {
// sometimes an ArrayIndexOutOfBoundsException occurs
}
if (panTab.getSelectedIndex() == 1) {
UIConstants.setWorker(true);
//m_Pnl.setCursor(new Cursor(Cursor.WAIT_CURSOR));
panContent.setEditorPane(txtEditor);
panContent.load(viewComponent, false);
//m_Pnl.setCursor(Cursor.getDefaultCursor());
} else if ((panTab.getSelectedIndex() == 4) || strTabName.equalsIgnoreCase(rb.getString("panel.toolContent.tab.safeguard"))) {
panSafeGuard.load(viewComponent);
} else {
ActionHub.fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, Constants.ACTION_CONTENT_DESELECT));
btnSave.setEnabled(true);
}
lastIndex = panTab.getSelectedIndex();
}
}
public boolean getSaveStatus() {
return saveStatus;
}
public synchronized void save() {
if (viewComponent.getOnline() == Constants.ONLINE_STATUS_ONLINE && panTab.getSelectedIndex() == 0) {
int i = JOptionPane.showConfirmDialog(this,
rb.getString("alert.deploy.publishToLive"),
rb.getString("dialog.title"), JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (i != JOptionPane.YES_OPTION) {
return;
}
}
Main.getInstance().freezeInput(true);
Constants.IS_SAVING=true;
UIConstants.setActionStatus(rb.getString("statusinfo.content.save"));
btnSave.setEnabled(false);
ActionHub.configureProperty(PanelContent.PROP_CHECKIN, PropertyConfigurationEvent.PROP_ENABLE, "false");
ActionHub.configureProperty(PanelContent.PROP_CHECKOUT, PropertyConfigurationEvent.PROP_ENABLE, "false");
Constants.EDIT_CONTENT = false;
try {
// Menu entry
panMenuentry.save();
viewComponent = panMenuentry.getViewComponent();
saveStatus = true;
// Metadata
if (comm.isUserInRole(UserRights.PAGE_VIEW_METADATA)) {
panMetaData.save();
ViewComponentValue vc = panMetaData.getViewComponent();
if (vc != null) {
viewComponent.setMetaData(vc.getMetaData());
viewComponent.setMetaDescription(vc.getMetaDescription());
}
}
if (panTab.getSelectedIndex() == 0) {
int maxLinkNameLength = 255;
try {
maxLinkNameLength = Integer.parseInt(Parameters.getStringParameter(Parameters.PARAM_MAX_DISPLAY_LINK_NAME_LENGTH));
} catch (Exception e) {
}
if (panMenuentry.getTxtText().getText().length() > maxLinkNameLength) {
JOptionPane.showMessageDialog(UIConstants.getMainFrame(), Messages.getString("panel.panelView.content.linkNameTooLongWarning", new String[] {Integer.toString(maxLinkNameLength)}), rb.getString("dialog.title"), JOptionPane.WARNING_MESSAGE);
}
}
if (panTab.getSelectedIndex() == 3) {
panContent.setContent(txtEditor.getText());
} else if (panTab.getSelectedIndex() == 1) {
panContent.save();
}
if (viewComponent.getStatus() == Constants.DEPLOY_STATUS_EDITED) {
// If you checkIn a NEW Contentversion, your "REMOVE-COMMAND" will also be removed
if (viewComponent.getDeployCommand() == Constants.DEPLOY_COMMAND_DELETE || viewComponent.getDeployCommand() == Constants.DEPLOY_COMMAND_REMOVE) {
viewComponent.setDeployCommand(Constants.DEPLOY_COMMAND_MODIFY);
}
log.debug("updating status");
comm.updateStatus4ViewComponent(viewComponent);
}
if (viewComponent.getStatus() == Constants.DEPLOY_STATUS_DEPLOYED) {
log.debug("updating status");
viewComponent.setStatus(Constants.DEPLOY_STATUS_EDITED);
comm.updateStatus4ViewComponent(viewComponent);
}
try {
viewComponent = comm.saveViewComponent(viewComponent);
if(isFromSaveButton)
ActionHub.fireActionPerformed(new ActionEvent(viewComponent, ActionEvent.ACTION_PERFORMED, Constants.ACTION_TREE_ENTRY_NAME));
} catch (ViewComponentLinkNameAlreadyExisting vc) {
JOptionPane.showMessageDialog(UIConstants.getMainFrame(), rb.getString("exception.ViewComponentLinkNameAlreadyExisting"), rb.getString("dialog.title"), JOptionPane.ERROR_MESSAGE);
} catch (ViewComponentNotFound vn) {
JOptionPane.showMessageDialog(UIConstants.getMainFrame(), rb.getString("exception.ViewComponentNotFound"), rb.getString("dialog.title"), JOptionPane.ERROR_MESSAGE);
} catch (ViewComponentLinkNameIsEmptyException ve) {
JOptionPane.showMessageDialog(UIConstants.getMainFrame(), rb.getString("exception.ViewComponentLinkNameIsEmpty"), rb.getString("dialog.title"), JOptionPane.ERROR_MESSAGE);
}
panSafeGuard.save();
} catch (Exception exe) {
log.error("Save Error", exe);
}
btnSave.setEnabled(true);
ActionHub.configureProperty(PanelContent.PROP_CHECKIN, PropertyConfigurationEvent.PROP_ENABLE, "true");
UIConstants.setActionStatus("");
Constants.IS_SAVING=false;
Main.getInstance().freezeInput(false);
}
public synchronized void load(ViewComponentValue value) {
if (getSaveStatus()) {
UIConstants.setWorker(true);
boolean showFrameset = Parameters.getBooleanParameter(Parameters.PARAM_SHOW_PREVIEW_FRAMESET);
radioPreviewFrameset.setVisible(showFrameset);
radioPreviewWithoutFrame.setVisible(showFrameset);
panTab.setSelectedIndex(0);
btnSave.setEnabled(false);
viewComponent = value;
if (panTab.getSelectedIndex() == 1) {
panContent.setEditorPane(txtEditor);
panContent.load(value, false);
} else {
btnSave.setEnabled(true);
}
panMenuentry.load(value);
panTab.setSelectedIndex(0);
panTab.setEnabledAt(1, panMenuentry.shouldBeEdtiable()); //Content
panTab.setEnabledAt(2, comm.isUserInRole(UserRights.PAGE_VIEW_METADATA) && panMenuentry.shouldBeEdtiable()); //metadata
if (comm.isUserInRole(UserRights.PAGE_VIEW_METADATA) && panMenuentry.shouldBeEdtiable()) panMetaData.load(value);
// the button for changing the template is invisible if user doesn't have the right to change
panMenuentry.setTemplateButtonEnabled(panMenuentry.shouldBeEdtiable());
this.btnSave.setEnabled(panMenuentry.shouldBeEdtiable());
if ((comm.isUserInRole(UserRights.MANAGE_SAFEGUARD) || (comm.getUser().isMasterRoot())) && (panTab.getSelectedIndex() == 4)) {
panSafeGuard.load(value);
} else {
panSafeGuard.load(null); // reset panel (needed that the panel wont be saved for a wrong vc)
}
} else {
btnSave.setEnabled(true);
}
}
public void unload() {
//comm.fireActionPerformed(new ActionEvent(null, ActionEvent.ACTION_PERFORMED, Constants.ACTION_CONTENT_DESELECT));
//comm.removeActionListener(this);
panMenuentry.unload();
panContent.unload();
panMetaData.unload();
panSafeGuard.unload();
}
public void unloadAll() {
this.unload();
this.panContent.unloadAll();
instance = null;
}
private void cmdCancelActionPerformed(ActionEvent e) {
Constants.EDIT_CONTENT = false;
if (panTab.getSelectedIndex() == 1) {
panContent.checkIn();
}
unload();
ActionHub.fireActionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, Constants.ACTION_TREE_DESELECT));
}
private void btnPreviewActionPerformed(ActionEvent e) {
boolean showInFrame = false;
if (this.radioPreviewFrameset.isSelected()) {
showInFrame = true;
}
int id = viewComponent.getViewComponentId().intValue();
comm.showBrowserWindow(id, showInFrame);
}
public void actionPerformed(ActionEvent ae) {
if (ae.getActionCommand().equals(Constants.ENABLE_CHECKIN) || ae.getActionCommand().equals(Constants.ACTION_CONTENT_DESELECT)) {
btnSave.setEnabled(true);
} else if (ae.getActionCommand().equals(Constants.ENABLE_CHECKOUT)) {
btnSave.setEnabled(false);
} else if (ae.getActionCommand().equals(Constants.ACTION_SAVE)) {
if (log.isDebugEnabled()) log.debug("actionPerformed::ACTION_SAVE");
isFromSaveButton = false;
save();
} else if (ae.getActionCommand().equals(Constants.ACTION_TREE_SET_NODE)) {
treeNode = (TreePath) ae.getSource();
} else if (ae.getActionCommand().equals(Constants.ACTION_TREE_RESET_CONSTANTS_CONTENT_VIEW)) {
saveStatus = true;
}
}
public ViewComponentValue getViewComponent() {
return viewComponent;
}
}