⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sendclustermessageshell.java

📁 类似于MSN
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
			}
			return main.openNormalMessageShell(f2);
		}
		return null;
	}

	/**
	 * 关闭窗口
	 */
	protected void close() {
		if(shell != null && !shell.isDisposed())
			shell.close();
	}

	/**
	 * 发送群消息
	 * @param string
	 */
	protected void sendMessage(String message) {
	    // 检查消息是否为空
	    if(message.length() == 0) {
	        MessageBox box = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK);
	        box.setText(LumaQQ.getResourceString("message.box.common.warning.title"));
	        box.setMessage(LumaQQ.getResourceString("message.box.cannot.send.empty.message"));
	        box.open();
	        return;
	    }
	    // 判断用户是否登录
		if(main.client.getUser().isLoggedIn()) {
			// 判断消息长度是否大于400,如果是,拆分发送
			int len = message.length();
			int j = 0;
			for(int i = 0; j < len; i += QQ.MAX_SEND_IM_SIZE) {
				j = i + QQ.MAX_SEND_IM_SIZE;
				if(j > len) j = len;
				String segment = message.substring(i, j);
				main.client.sendClusterMessage(c.getClusterId(), segment);
				// 如果是聊天模式,则把发送的消息显示到输出框中
				date.setTime(System.currentTimeMillis());
				setMessage((String)main.myModel.getProperty("name"), segment, date);
				// 保存到聊天记录中
				main.mm.saveMessage(c.getClusterId(), c.getClusterId(), main.myModel.getQQ(), segment, (int)(date.getTime() / 1000));
				// 清空发送框
				inputBox.clear();
			}
		} else {
			MessageBox box = new MessageBox(shell, SWT.ICON_WARNING | SWT.OK);
			box.setText(LumaQQ.getResourceString("message.box.common.warning.title"));
			box.setMessage(LumaQQ.getResourceString("message.box.please.login.first"));
			box.open();
		}
	}
	
	/**
	 * 设置已经发送的消息,这个方法只用在聊天模式时
	 * @param name 发送消息的人的昵称
	 * @param msg 消息内容
	 * @param date 消息发送时间
	 */
	public void setMessage(String name, String msg, Date date) {
		outputBox.appendMessage("(" + name + ")  " + DateFormat.getTimeInstance(DateFormat.LONG).format(date));
		outputBox.appendMessage("\n" + msg + "\n\n");
	}
	
	/**
	 * 设置已经发送的消息,这个方法只用在聊天模式时
	 * @param name 发送消息的人的昵称
	 * @param msg 消息内容
	 * @param time 消息发送时间
	 */
	public void setMessage(String name, String msg, long time) {
		date.setTime(time);
		setMessage(name, msg, date);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.swt.events.DisposeListener#widgetDisposed(org.eclipse.swt.events.DisposeEvent)
	 */
	public void widgetDisposed(DisposeEvent e) {
		buttonColor.dispose();
		toolbarBackground.dispose();
	}

	/* (non-Javadoc)
	 * @see edu.tsinghua.lumaqq.qq.events.QQListener#qqEvent(edu.tsinghua.lumaqq.qq.events.QQEvent)
	 */
	public void qqEvent(QQEvent e) {
		switch(e.type) {
			case QQEvent.QQ_GET_ONLINE_MEMBER_SUCCESS:
				processClusterGetOnlineMemberSuccess(e);
				break;			
			case QQEvent.QQ_GET_CLUSTER_INFO_FAIL:
			case QQEvent.QQ_GET_MEMBER_INFO_FAIL:
			case QQEvent.QQ_GET_ONLINE_MEMBER_FAIL:
			case QQEvent.QQ_SEND_CLUSTER_IM_FAIL:
				processClusterCommandFail(e);
				break;
			case QQEvent.QQ_OPERATION_TIMEOUT:
			    if(e.operation == QQ.QQ_CMD_CLUSTER_CMD)
			        processClusterCommandTimeout(e);
			    break;
		}
	}		

	/**
	 * 处理群操作超时事件,对于超时事件,重新操作一次
     * @param e
     */
    private void processClusterCommandTimeout(QQEvent e) {
        ClusterCommandPacket packet = (ClusterCommandPacket)e.getSource();
        switch(packet.getSubCommand()) {
        	case QQ.QQ_CLUSTER_CMD_GET_ONLINE_MEMBER:
        	    display.asyncExec(refreshRunnable);
        		break;
        	default:
        	    break;
        }
    }

    /**
	 * <pre>
	 * 处理群命令失败事件:失败时,弹出一个对话框提示,如果错误类型表示自己已经不是这个群的
	 * 成员,则移除这个群
	 * </pre>
	 * @param e
	 */
	private void processClusterCommandFail(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		if(packet.clusterId == c.getClusterId()) {
			main.display.asyncExec(new Runnable() {
				public void run() {
					MessageBox box = new MessageBox(main.getShell(), SWT.ICON_ERROR | SWT.OK);
					box.setText(LumaQQ.getResourceString("message.box.common.fail.title"));
					box.setMessage(packet.errorMessage);
					box.open();
					if(packet.replyCode == QQ.QQ_CLUSTER_CMD_REPLY_NOT_MEMBER) {
						main.removeCluster(c.getClusterId());
					}
				}				
			});			
		}
	}

	/**
	 * 处理得到在线成员成功事件。刷新在线的状态
	 * @param e
	 */
	private void processClusterGetOnlineMemberSuccess(QQEvent e) {
		final ClusterCommandReplyPacket packet = (ClusterCommandReplyPacket)e.getSource();
		// 如果群内部ID等于这个窗口的群内部ID,才需要处理
		if(packet.clusterId == c.getClusterId()) {
			main.display.syncExec(
				new Runnable() {
					public void run() {
						if(c != null) {
							Hashtable members = (Hashtable)c.getProperty("members");
							// 把每个成员的状态置为下线
							Iterator iter = members.values().iterator();
							while(iter.hasNext()) 
								((FriendModel)iter.next()).addProperty("status", "offline");
							// 对每个在线的成员,设置他们的在线状态
							iter = packet.onlineMembers.iterator();
							while(iter.hasNext()) {
								Integer key = (Integer)iter.next();
								FriendModel f = (FriendModel)members.get(key);
								if(f != null) 
									f.addProperty("status", "online");
							}
							// 得到所有成员的model列表
							List models = new ArrayList();
							models.addAll(members.values());
							// 对这个数组排序
							Collections.sort(models, new MemberComparator());
							// 再次添加已经排序好了的item,对于原来的item并不删除,而是直接改变他们的值
							//     这样快一些
							int count = models.size();
							int itemCount = memberTable.getItemCount();
							for(int i = 0; i < count; i++) {
								FriendModel f = (FriendModel)models.get(i);
								TableItem ti = (i >= itemCount) ? new TableItem(memberTable, SWT.NONE) : memberTable.getItem(i);
								ti.setText((String)f.getProperty("name"));
								ti.setImage(main.getSmallFaceByStatus(f));
								ti.setData(f);
							}
							// 清除旧项
							if(itemCount > count)
								memberTable.remove(count, itemCount - 1);
							// 1分钟后再次刷新成员列表
							display.timerExec(REFRESH_INTERVAL, refreshRunnable);
						}
					}					
				}		
			);
		}
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.swt.events.ShellListener#shellClosed(org.eclipse.swt.events.ShellEvent)
	 */
	public void shellClosed(ShellEvent e) {
		main.client.removeQQListener(this);
		main.removeMeFromSCMSMap(c);
	}
	
    /* (non-Javadoc)
     * @see org.eclipse.swt.events.ShellListener#shellActivated(org.eclipse.swt.events.ShellEvent)
     */
    public void shellActivated(ShellEvent e) {
        stopBlinkImage();
        active = true;
    }
    
    /* (non-Javadoc)
     * @see org.eclipse.swt.events.ShellListener#shellDeactivated(org.eclipse.swt.events.ShellEvent)
     */
    public void shellDeactivated(ShellEvent e) {
        active = false;
    }
	
	/**
	 * 是当前窗口激活
	 */
	public void setActive() {
		shell.setActive();
	}	
	
	/**
	 * 代理方法,设置窗口的最小化状态
	 * @param b
	 */
	public void setMinimized(boolean b) {
		shell.setMinimized(b);
	}
	
	/**
	 * 使chatbox获得焦点
	 */
	public void setFocus() {
		inputBox.setFocus();
	}
	
	/**
	 * 打开shell
	 */
	public void open()	{
		// 刷新布局
		shell.layout();
		// 窗口居中
		Rectangle dialogRect = shell.getBounds();
		Rectangle displayRect = display.getBounds();
		shell.setLocation((displayRect.width - dialogRect.width) / 2, (displayRect.height - dialogRect.height) / 2);
		shell.open();
		// 设置输入框获得焦点,设置输入框的字体和颜色
		inputBox.setFocus();
		if(main.font != null)
			inputBox.setFont(main.font);
		if(main.fontColor != null)
			inputBox.setForeground(main.fontColor);
		// add me as qq listener
		main.client.addQQListener(this);
		// 得到在线成员
		main.client.getClusterOnlineMember(c.getClusterId());
	}
	
	/**
	 * 设置群的model
	 * @param c
	 */
	public void setClusterModel(ClusterModel c) {
		this.c = c;
		blinkRunnable.setBlinkImage(c.getImage());
		viewer.setQQ(c.getClusterId());
		viewer.setExporter(new ClusterMessageExporter(c));
		viewer.setFormatter(new ClusterMessageFormatter(c));
		lblId.setText(LumaQQ.getResourceString("send.cluster.message.label.id", new Object[] { String.valueOf(c.getExternalId()) } ));
		lblName.setText(LumaQQ.getResourceString("send.cluster.message.label.name", new Object[] { c.getProperty("name") }));
		btnCluster.setImage((Image)c.getProperty("image"));
		shell.setImage((Image)c.getProperty("image"));
		shell.setText(LumaQQ.getResourceString("send.cluster.message.title", new Object[] { c.getProperty("name") }));
		Hashtable members = (Hashtable)c.getProperty("members");
		Iterator iter = members.values().iterator();
		while(iter.hasNext()) {
			FriendModel f = (FriendModel)iter.next();
			TableItem ti = new TableItem(memberTable, SWT.NONE);
			ti.setText((String)f.getProperty("name"));
			ti.setImage(main.getSmallFaceByStatus(f));
			ti.setData(f);
		}
		display.timerExec(REFRESH_INTERVAL, refreshRunnable);
	}
	
	// 比较中文字符串,比较后的结果按照拼音方式排序
	private int compareChineseString(String _n1, String _n2) {
		String n1 = null, n2 = null;
        try {
            n1 = new String(_n1.getBytes("GBK"), "ISO-8859-1");
            n2 = new String(_n2.getBytes("GBK"), "ISO-8859-1");
        } catch (UnsupportedEncodingException e) {
            n1 = _n1;
            n2 = _n2;
        }
        return n1.compareTo(n2);
	}
	
	/**
	 * 设置群头像
	 * @param image
	 */
	public void setFace(Image image) {
		if(image == null) return;
		btnCluster.setImage(image);
		shell.setImage(image);
	}
	
    /**
     * 开始闪烁图标
     */
    public void startBlinkImage() {
        if(!blinkRunnable.isStop()) return;
        blinkRunnable.setStop(false);
        display.timerExec(0, blinkRunnable);
    }
    
    /**
     * 停止闪烁
     */
    public void stopBlinkImage() {
        blinkRunnable.setStop(true);
    }
    
    /**
     * @return true表示当前窗口为active
     */
    public boolean isActive() {
        return active;
    }
    
    /**
     * @return true表示窗口处于最小化状态
     */
    public boolean isMinimized() {
        return shell.getMinimized();
    }

	/* (non-Javadoc)
	 * @see edu.tsinghua.lumaqq.events.AcceleratorListener#acceleratorPressed(org.eclipse.swt.events.KeyEvent)
	 */
	public void acceleratorPressed(KeyEvent e) {
		// 按下了enter键
		if(e.keyCode == SWT.CR) {
			boolean b = options.isUseEnterInTalkMode();
			if((e.stateMask & SWT.CTRL) != 0) { // ctrl也按下了
				if(!b)
					sendMessage(inputBox.getMessage());
			} else {
				if(b) 							
					sendMessage(inputBox.getMessage());
			}
		} else if(e.stateMask == SWT.ALT) {
		    if(e.character == 's' || e.character == 'S')
		        sendMessage(inputBox.getMessage());
		    else if(e.character == 'h' || e.character == 'H')
		        showRecord();
		    else if(e.character == 'c' || e.character == 'C')
		        close();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -