/* * Kontalk Java client * Copyright (C) 2016 Kontalk Devteam <devteam@kontalk.org> * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kontalk.view; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.util.List; import com.alee.extended.colorchooser.GradientData; import com.alee.extended.filechooser.WebFileChooserField; import com.alee.extended.panel.GroupPanel; import com.alee.extended.panel.GroupingType; import com.alee.laf.button.WebButton; import com.alee.laf.label.WebLabel; import com.alee.laf.optionpane.WebOptionPane; import com.alee.laf.radiobutton.WebRadioButton; import com.alee.laf.separator.WebSeparator; import com.alee.laf.slider.WebSlider; import com.alee.laf.text.WebTextArea; import com.alee.managers.tooltip.TooltipManager; import com.alee.utils.swing.UnselectableButtonGroup; import org.apache.commons.lang.StringUtils; import org.kontalk.model.chat.Chat; import org.kontalk.model.chat.GroupChat; import org.kontalk.model.chat.Member; import org.kontalk.util.Tr; import org.kontalk.view.ComponentUtils.LabelTextField; import org.kontalk.view.ComponentUtils.MemberList; /** * Show and edit thread/chat settings. * * @author Alexander Bikadorov {@literal <bikaejkb@mail.tu-berlin.de>} */ final class ChatDetails extends ComponentUtils.PopupPanel { private static final Color DEFAULT_BG = Color.WHITE; private final View mView; private final Chat mChat; private final LabelTextField mSubjectField; private final WebRadioButton mColorOpt; private final WebButton mColor; private final WebRadioButton mImgOpt; private final WebFileChooserField mImgChooser; //WebCheckBoxList mParticipantsList; ChatDetails(View view, Chat chat) { mView = view; mChat = chat; GroupPanel groupPanel = new GroupPanel(View.GAP_BIG, false); groupPanel.setMargin(View.MARGIN_BIG); groupPanel.add(new WebLabel(mChat.isGroupChat() ? Tr.tr("Edit Group Chat") : Tr.tr("Edit Chat")).setBoldFont()); groupPanel.add(new WebSeparator(true, true)); // editable fields mSubjectField = new LabelTextField(mChat.getSubject(), View.MAX_SUBJ_LENGTH, mChat.isAdministratable(), 16, this); if (mChat instanceof GroupChat) { GroupChat groupChat = (GroupChat) mChat; groupPanel.add(new GroupPanel(View.GAP_DEFAULT, new WebLabel(Tr.tr("Subject:")), mSubjectField)); groupPanel.add(new WebLabel(Tr.tr("Participants:"))); MemberList mParticipantsList = new MemberList(false); List<Member> chatMember = Utils.memberList(mChat); mParticipantsList.setMembers(chatMember); mParticipantsList.setVisibleRowCount(Math.min(chatMember.size(), 5)); groupPanel.add(new ComponentUtils.ScrollPane(mParticipantsList, false).setPreferredWidth(160)); WebButton leaveButton = new WebButton(Tr.tr("Leave group")); leaveButton.setEnabled(chat.isValid()); TooltipManager.addTooltip(leaveButton, groupChat.containsMe() ? Tr.tr("Leave this group chat") : Tr.tr("You are not a member of this group")); leaveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { boolean left = ChatDetails.this.leave(groupChat); if (left) ChatDetails.this.setVisible(false); } }); groupPanel.add(leaveButton); groupPanel.add(new WebSeparator(true, true)); } final WebSlider colorSlider = new WebSlider(WebSlider.HORIZONTAL); groupPanel.add(new WebLabel(Tr.tr("Custom Background"))); mColorOpt = new WebRadioButton(Tr.tr("Color:") + " "); Color bgColor = mChat.getViewSettings().getBGColor().orElse(null); mColorOpt.setSelected(bgColor != null); mColorOpt.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { colorSlider.setEnabled(e.getStateChange() == ItemEvent.SELECTED); } }); mColor = new WebButton(); mColor.setMinimumHeight(25); Color oldColor = bgColor != null ? bgColor : DEFAULT_BG; mColor.setBottomBgColor(oldColor); groupPanel.add(new GroupPanel(GroupingType.fillLast, mColorOpt, mColor)); colorSlider.setMinimum(0); colorSlider.setMaximum(100); colorSlider.setPaintTicks(false); colorSlider.setPaintLabels(false); colorSlider.setEnabled(bgColor != null); final GradientData gradientData = GradientData.getDefaultValue(); // TODO set location for color gradientData.getColor(0); colorSlider.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { float v = colorSlider.getValue() / (float) 100; Color c = gradientData.getColorForLocation(v); mColor.setBottomBgColor(c); mColor.repaint(); } }); groupPanel.add(colorSlider); mImgOpt = new WebRadioButton(Tr.tr("Image:") + " "); String imgPath = mChat.getViewSettings().getImagePath(); mImgOpt.setSelected(!imgPath.isEmpty()); mImgOpt.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { mImgChooser.setEnabled(e.getStateChange() == ItemEvent.SELECTED); mImgChooser.getChooseButton().setEnabled(e.getStateChange() == ItemEvent.SELECTED); } }); mImgChooser = Utils.createImageChooser(imgPath); mImgChooser.setPreferredWidth(1); groupPanel.add(new GroupPanel(GroupingType.fillLast, mImgOpt, mImgChooser)); UnselectableButtonGroup.group(mColorOpt, mImgOpt); groupPanel.add(new WebSeparator()); String xmppID = mChat.getXMPPID(); if (!xmppID.isEmpty()) { WebTextArea xmppIDArea = new WebTextArea().setBoldFont(); xmppIDArea.setEditable(false); xmppIDArea.setOpaque(false); xmppIDArea.setText(StringUtils.abbreviate(xmppID, View.MAX_XMPP_ID_LENGTH)); TooltipManager.addTooltip(xmppIDArea, Tr.tr("XMPP chat ID:") + " " + xmppID); WebLabel xmppIDLabel = new WebLabel(Tr.tr("Chat ID:")); groupPanel.add(new GroupPanel(View.GAP_DEFAULT, xmppIDLabel, xmppIDArea)); } final WebButton saveButton = new WebButton(Tr.tr("Save")); this.add(groupPanel, BorderLayout.CENTER); saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ChatDetails.this.save(); ChatDetails.this.setVisible(false); } }); //this.getRootPane().setDefaultButton(saveButton); GroupPanel buttonPanel = new GroupPanel(2, saveButton); buttonPanel.setLayout(new FlowLayout(FlowLayout.TRAILING)); this.add(buttonPanel, BorderLayout.SOUTH); } private boolean leave(GroupChat chat) { String warningText = Tr.tr("You won't be able to enter this group again after you leave."); int selectedOption = WebOptionPane.showConfirmDialog(this, warningText, Tr.tr("Please Confirm"), WebOptionPane.OK_CANCEL_OPTION, WebOptionPane.WARNING_MESSAGE); if (selectedOption == WebOptionPane.OK_OPTION) { mView.getControl().leaveGroupChat(chat); return true; } return false; } private void save() { String subj = mSubjectField.getText(); if (subj.length() > 0 && !mSubjectField.getText().equals(mChat.getSubject()) && mChat instanceof GroupChat) { mView.getControl().setChatSubject((GroupChat) mChat, mSubjectField.getText()); } // List<?> participants = mParticipantsList.getCheckedValues(); // Set<Contact> chatContact = new HashSet<>(); // for (Object o: participants) { // chatContact.add(((ContactElement) o).contact); // } // mChat.setContact(chatContact); Chat.ViewSettings newSettings; if (mColorOpt.isSelected()) { newSettings = Chat.ViewSettings.fromColor(mColor.getBottomBgColor()); } else if (mImgOpt.isSelected() && !mImgChooser.getSelectedFiles().isEmpty()) { newSettings = Chat.ViewSettings.fromImagePath(mImgChooser.getSelectedFiles().get(0).getAbsolutePath()); } else { newSettings = Chat.ViewSettings.createDefault(); } if (!newSettings.equals(mChat.getViewSettings())) { mChat.setViewSettings(newSettings); } } }