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

📄 sendclustermessageshell.java

📁 用java实现的
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		);
		// 设置消息管理器、字符串格式化器,导出器
		viewer.setMessageManager(main.mm);
		// 添加表头
		viewer.setTableColumn(new String[] { LumaQQ.getResourceString("send.cluster.message.table.header.nick"), LumaQQ.getResourceString("send.cluster.message.table.header.time"), LumaQQ.getResourceString("send.cluster.message.table.header.message") });
		viewer.setTableColumnWidth(new String[] { "80", "120", "*" });
		// tableitem双击事件监听器
		viewer.addSelectionListener(
			new SelectionAdapter() {
				public void widgetDefaultSelected(SelectionEvent e) {
					TableItem ti = viewer.getSelectedItem();
					inputBox.setMessage(ti.getText(2));
				}
			}
		);
	}

	/**
	 * 打开与某个成员的聊天窗口
	 * @return 打开的窗口对象,可能为ReceiveMessageShell, 也可能为SendMessageShell
	 */
	protected Object openMemberMessageShell() {
		int index = memberTable.getSelectionIndex();
		if(index != -1) {
			TableItem ti = memberTable.getItem(index);
			FriendModel f = (FriendModel)ti.getData();
			// 在现在的好友中查找这个model
			FriendModel f2 = main.getFriendModel(f.getQQ());
			// 如果找到model为null,说明这个人不是我的好友了,为了界面上的一致
			//     性,把这个人添加到陌生人再打开窗口。否则,这个人肯定已经在model中
			//     ,直接打开窗口
			if(f2 == null) {
				/* 否则这个人还不是我的好友, */
				f2 = f;
				int[] stranger = main.model.findTabIndex(main.strangerMatcher);
				if(stranger != null && stranger.length > 0) {
					main.model.addItem(stranger[0], f);
					main.shutter.refreshTabView(stranger[0]);
				}
			}
			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;
		}
	}		

	// 处理群命令失败事件
	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());
						}
					}				
				}
			);			
		}
	}

	// 处理得到在线成员成功事件
	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);
		// 得到在线成员
		if(main.client.getUser().isLoggedIn())
			main.client.getClusterOnlineMember(c.getClusterId());
	}
	
	/**
	 * 设置群的model
	 * @param c
	 */
	public void setClusterModel(ClusterModel c) {
		this.c = c;
		blinkRunnable.setBlinkImage(c.getImage());
		viewer.setQqNum(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();
    }
}

⌨️ 快捷键说明

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